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?

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|

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? %>

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).


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


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.