2012-05-31 11 views
11

form_forのクラスをhtml: {class: "form-horizontal"}オプションで追加すると、デフォルトのnew_modelまたはedit_modelクラスが上書きされます。既存のform_helperクラスを維持しながらクラスを追加するにはどうすればよいですか?既存のデフォルトヘルパークラスを設定/上書きせずに、クラスをレール上のルビーのフォームに追加するにはどうすればよいですか?

私が欲しい:

<form class="edit_model form-horizontal">または

​​

の代わりに:たぶん

<form class="form-horizontal">

答えて

0
html: {class: "edit_model form-horizontal"} 
+2

フォームビルダの美しさは、edit_modelクラスとnew_modelクラスを自動的に切り替えることです。私は、それが新しいオブジェクトであるかどうかを検出するifステートメントの中にオブジェクトを置かなくても、これを行うための洗練された方法を望みます。 – Evan

1

ない理想的なソリューションを、しかし、あなたがそれをやって考えられてきましたJS/Jquery?例えば

$(document).ready(function(){ 
    $('form.edit_model').addClass('form-horizontal') 
}); 
6

私は正確に同じ問題に遭遇しました。結局、私はこれはあなたに多くの使用であることが、多分他の誰かがそれを便利になるために少し遅すぎるかもしれません

form_for @foo, :html => {:class => "form-horizontal #{controller.action_name}_model_name"} 

この解決策を考え出しました。

0

マージメソッドを試しましたか? [http://ruby-doc.org/core-1.9.3/Hash.html#method-i-merge]何かhtml = html.merge(new){| key、value1、value2 | value1 + "" + value2}を使用すると、新しい値をクラス値に入力できます。 [迅速な編集:htmlを完全に上書きしないように実装を構成しテストするように注意してください)

0

ビューヘルパーdom_class(object, prefix = nil)を使用して、form_forのようなクラス名を生成できます。

フォームで直接行うのはあまりクリーンではありませんが、ヘルパーに組み込むことは単なるチケットかもしれません。たとえば::html => {:class => '...'}オプションを使用してクラスを定義

# app/helpers/application_helper.rb 
def class_for object, *additional_classes 
    additional_classes.unshift dom_class(object, object.persisted? ? 'edit' : 'new') 
end 

# app/views/models/_form.html.erb 
<%= form_for @model, :html => {:class => class_for(@model, 'form-horizontal')} do |f| %> 
    <%# ... %> 
<% end %> 

<form class="new_model form-horizontal" ...> 
1

は、デフォルトのビルダーによって追加されたクラスを上書きします。ただし、これらのクラスをオーバーライドしないで、ブロック内にCSSクラスを追加することはできます。

form_forヘルパーの場合、:classは、そうでない場合は文字列になります。追加する際の先頭のスペースに注意してください。

<%= form_for @model do |f| %> 
    <% f.options[:html][:class] << ' form-horizontal' %> 
    <%# ... %> 
<% end %> 

<form class="edit_model form-horizontal"> 

あなたがsimple_form_forヘルパーを使用している場合、options[:html][:class]は配列になります、と(それは悪くはないが)、あなたは余分な先頭のスペースを必要としません。

<%= simple_form_for @model do |f| %> 
    <% f.options[:html][:class] << 'form-horizontal' %> 
    <%# ... %> 
<% end %> 

<form class="simple_form edit_model form-horizontal"> 

あなたはシンボルの代わりに、モデルを使用している場合、form_forは、クラスを設定していないだろう、とoptions[:html][:class]はブロックにnilなります。しかし、これをやっているのであれば、とにかく新しいモデルや永続するモデルはありません。

<%= form_for :model do |f| %> 
    <% f.options[:html][:class] << ' form-horizontal' %> 
    <%# ... %> 
<% end %> 

NoMethodError: undefined method `<<' for nil:NilClass 
関連する問題