Usar o form_for do Rails, mas definir classes personalizadas, atributos no elemento <form>?

89

form_forparece ignorar qualquer atributo 'extra' como um data-fooatributo ou classpassado como optionsem seu segundo argumento.

= form_for @user, {:url => 'foo', :class => 'x', 'data-bar' => 'baz' } do |f|
  # ...

A saída é uma <form>tag sem xclasse ou data-baratributo.

Qual é a solução?

Ou como posso obter uma FormBuilderinstância sem usar form_for?

Alan H.
fonte

Respostas:

191

Use o :htmlhash:

= form_for @user, :html => {:class => 'x', 'data-bar' => 'baz'} do |f|

Ou

= form_for @user, html: {class: 'x', data: { bar: 'baz' } } do |f|
MurifoX
fonte
1
Descobri que isso não funciona: = form_for @user, :html => {'class' => 'x'} do |f|. classdeve ser um símbolo em vez de uma string.
Trantor Liu
11

Rails 4.0.3, Ruby 2.1.0p0 -> funcionou para mim =>

<%= form_for(@contact, :html => {:class => 'form_height'}) do |f| %><% if     @contact.errors.any? %>
zero_cool
fonte
4

Eu tive o mesmo problema, mas fiquei intrigado porque outro formulário em outro lugar em meu aplicativo estava funcionando bem.

Percebi que acidentalmente adicionei um form_for dentro de outro form_for que, uma vez removido, resolveu o problema.

Em segundo lugar, devo acrescentar que essa sintaxe funciona para mim no Rails 4.2:

<%= form_for @type, html: {class: "form-horizontal"} do |f| %>

Acho que é preferível à sopa de pontuação das outras respostas aqui (que foram talvez baseadas em uma versão mais antiga do Rails).

MSC
fonte
1

Na maioria dos auxiliares, o último argumento é um hash de opções html para o elemento.

= form_for @user, :html => {:class => 'x', 'data-bar' => 'baz'} %>

Você também pode verificar outras alternativas na documentação ActionsView :: Helpers :: FormHelper

felipeclopes
fonte
1

Tentei o procedimento acima sem sorte, mas encontrei uma solução. Estou usando trilhos 4.1.6.

Isso não funcionou

= form_for @user, :html => {:class => 'x', 'data-bar' => 'baz'} %>

Isso fez

= form_for @user, html: {:class => 'x', 'data-bar' => 'baz'} %>

observe a diferença com a opção html, espero que isso ajude

doz87
fonte
3
Uau! Sério? aqueles devem ser exatamente equivalentes. Você pode reproduzir isso? Qual versão do Ruby você está usando?
Alan H.
@Alan H. Usando Ruby 2.1.3p242 = form_for(:user, :url => login_path, html: {:class => 'login_form'}) do |f| %> Esta era a única maneira que meu código aplicaria a classe, caso contrário, estaria apenas ignorando-a.
doz87
Essas duas linhas são exatamente idênticas. Supondo que você se esqueceu de salvar no meio?
nathanvda
Eu sei, eles deveriam ser. Para mim, simplesmente não estava funcionando. Salvar não era o problema.
doz87