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.