Erro de 'mesclagem' do método indefinido do campo oculto do Rails

152

Eu quero fazer algo assim nos trilhos

Aqui está o que eu tenho até agora nos trilhos:

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

Mas então eu recebo este erro:

undefined method `merge' for "test":String

Como posso passar valores no meu hidden_field no Rails?

Jake
fonte
64
Você aceitaria uma resposta?
apneadiving 11/08/19

Respostas:

417

Você deveria fazer:

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

hidden_field espera um hash como um segundo argumento

apneadiving
fonte
9
É uma espécie de inconsistente como nós também escrever <%= hidden_field_tag :service, "test" %>quando não estiver usando form_for |f|...
Augustin Riedinger
55

Você está usando um hidden_field em vez de um hidden_field_tag. Como você está usando a versão não _tag, presume-se que seu controlador já tenha definido o valor desse atributo no objeto que faz o backup do formulário. Por exemplo:

controlador:

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

Visão:

<%= form_for @order do |f| %>
  <%= f.hidden_field :service %>
  <%= f.submit %>
<% end %>
user132447
fonte
27

Funciona bem em Ruby 1.9 e rails 4

<%= f.hidden_field :service, value: "test" %>
Tushar.PUCSD
fonte
3

Uma versão com a nova sintaxe para hashes no ruby ​​1.9:

<%= f.hidden_field :service, value: "test" %>
Michael Durrant
fonte
2

Isso também funciona no Rails 3.2.12:

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

bradmalloy
fonte
0

A propósito, eu não uso campos ocultos para enviar dados do servidor para o navegador. Os atributos de dados são impressionantes. Você pode fazer

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

E, em seguida, obtenha o valor do atributo com jquery

$('form').data('service')
Alex Teut
fonte