acts_as_treeオブジェクトにバインドされたラジオボタンリストのカスタムフォームビルダーを作成する方法の例を探しています。ラジオボタンリストを表示するコードはすでにありますが、フォームビルダーにリファクタリングしてドライアップしたいと思います。ラジオボタンリスト用のカスタムフォームビルダーの例が見つかりません。
任意のポインタ/リンクをいただければ幸いです。
acts_as_treeオブジェクトにバインドされたラジオボタンリストのカスタムフォームビルダーを作成する方法の例を探しています。ラジオボタンリストを表示するコードはすでにありますが、フォームビルダーにリファクタリングしてドライアップしたいと思います。ラジオボタンリスト用のカスタムフォームビルダーの例が見つかりません。
任意のポインタ/リンクをいただければ幸いです。
多くの場合、このモデルでform_forをさまざまなビューから呼び出しており、すべてのフォームに同じラジオボタンのセットがあると仮定します。ここで取ることができるいくつかのルートがあります。ただし、ラジオボタンリストを自動的に追加する方法を尋ねているのか、それとも単に要約するのかはわかりません。
ラジオボタンリストを自動的に追加するには、私が共有できるよりも、ActionViewの内部に関する知識が少し必要です。基本的に、物事がどのようにレンダリングされるかを理解し、ActionView :: Helpers::FormHelperのfields_forメソッドをオーバーライドして正しく機能させる必要があります。残念ながら、FormBuilderはそのようには機能しません。ですから、それは価値があるよりもはるかに多くの問題になるでしょう。
より良いアプローチは、カスタムフォームビルダーですべてのラジオボタンを生成するメソッドを作成することです。変更が発生した場合に物事を単純にするために、モデルに定数を追加します。各キーがフォームのラジオボタンリストで表現したい属性メソッドであり、各値がその属性の許容値のリストであるハッシュになることを任意に決定しました。これにより、フォームビルダーを変更することなく、ラジオボタンの複数のリストを簡単に生成できます。PSハッシュを使用して、ラジオボタンに関連付けられている属性の内容を検証することもできます。
/app/models/example.rb
class Example < ActiveRecord::Base
...
RADIO_BUTTON_HASH = {
:attribute_a => [:accepted_value_a1, :accepted_value_a2, :accepted_value_a3],
:attribute_b => [:accepted_value_b1, :accepted_value_b2],
...
}
def self.radio_buttons_sort(a,b)
# sort method to ensure that multiple radio buttons lists appear in the order you want
end
def self.radio_buttons_sorted
RADIO_BUTTON_HASH.sort{|a,b| radio_button_sort(a,b)}
end
...
end
ハッシュに加えて便利なメソッドをいくつか追加しました。これらは必須ではありませんが、出力を標準化するためのよりクリーンなメソッドを提供します。
** / app / helpers/example_helper.rbモジュールExampleHelper
# the custom FormBuilder
class ExampleFormBuilder < ActionView::Helpers::FormBuilder
# add onkeypress and set maxlength of field to 3 to all text fields
def radio_button_list(options={})
Example.sorted_radio_buttons.each do |method,values|
values.each do |value|
radio_button(method, value, options)
end
end
end
end
end
次に、ExampleHelperが含まれているビューから(Exampleコントローラーによってレンダリングされたすべてのビューでデフォルトで実行されます)。
<%form_for @example, :builder => ExampleFormBuilder do |f| %>
...
<%=f.radio_button_list %>
<%end%>