Błąd „scalania” niezdefiniowanej metody w Railsach

152

Chcę zrobić coś takiego na torach

Oto co mam do tej pory w szynach:

<%= form_for @order do |f| %>
  <%= f.hidden_field :service, "test" %>
  <%= f.submit %>
<% end %>

Ale potem pojawia się ten błąd:

undefined method `merge' for "test":String

Jak mogę przekazać wartości w moim hidden_field w railsach?

Jake
źródło
64
Przyjąłbyś odpowiedź?
bezdech

Odpowiedzi:

417

Powinieneś zrobić:

<%= f.hidden_field :service, :value => "test" %>

hidden_field oczekuje skrótu jako drugiego argumentu

bezdechu
źródło
9
To trochę niekonsekwentne, ponieważ piszemy również, <%= hidden_field_tag :service, "test" %>gdy nie używamy form_for |f|...
Augustin Riedinger
55

Używasz pola hidden_field zamiast tagu hidden_field_tag. Ponieważ używasz wersji innej niż _tag, zakłada się, że kontroler ustawił już wartość tego atrybutu w obiekcie, który tworzy kopię zapasową formularza. Na przykład:

kontroler:

def new
  ...
  @order.service = "test"
  ...
end</pre>

widok:

<%= form_for @order do |f| %>
  <%= f.hidden_field :service %>
  <%= f.submit %>
<% end %>
user132447
źródło
27

Działa dobrze w Ruby 1.9 i szynach 4

<%= f.hidden_field :service, value: "test" %>
Tushar.PUCSD
źródło
3

Wersja z nową składnią skrótów w Rubim 1.9:

<%= f.hidden_field :service, value: "test" %>
Michael Durrant
źródło
2

Działa to również w Railsach 3.2.12:

<%= f.hidden_field :service, :value => "test" %>

bradmalloy
źródło
0

Nawiasem mówiąc, nie używam ukrytych pól do przesyłania danych z serwera do przeglądarki. Atrybuty danych są niesamowite. Możesz to zrobić

<%= form_for @order, 'data-service' => 'test' do |f| %>

A następnie uzyskaj wartość atrybutu za pomocą jquery

$('form').data('service')
Alex Teut
źródło