Rails 3 では:
私は次のモデルを持っています:
class System
has_many :input_modes # name of the table with the join in it
has_many :imodes, :through => :input_modes, :source => 'mode', :class_name => "Mode"
has_many :output_modes
has_many :omodes, :through => :output_modes, :source => 'mode', :class_name => 'Mode'
end
class InputMode # OutputMode is identical
belongs_to :mode
belongs_to :system
end
class Mode
... fields, i.e. name ...
end
それはうまく機能し、意図したとおりにリストを割り当てることができますModes
。imodes
omodes
私がやりたいのaccepts_nested_attributes_for
は、モデルでまたは他のそのような魔法を使用System
して、チェックボックスのセットでビューを構築することです。
Modes
特定の有効なセットは、別のSystem
場所で定義されています。ビューでチェックボックスを使用して、と_form
で実際に設定されている有効なモードを選択しています。このビューから新規作成するのではなく、事前定義された のリストから選択するだけです。imodes
omodes
Modes
Modes
以下は、私が現在私の_form
見解で使用しているものです。チェックボックスのリストを生成し、編集中の許可Mode
されたチェックボックスごとに 1 つずつ生成します。System
チェックボックスがチェックされている場合、それMode
はリストに含まれimodes
ます。
<% @allowed_modes.each do |mode| %>
<li>
<%= check_box_tag :imode_ids, mode.id, @system.imodes.include?(modifier), :name => 'imode_ids[]' %>
<%= mode.name %>
</li>
<% end %>
これをパラメーターでコントローラーに渡します。
{ ..., "imode_ids"=>["2", "14"], ... }
controller#create でModes
、対応するチェックボックスがオンになっている を抽出して割り当てimodes
、次のコードで追加します。
@system = System.new(params[:system])
# Note the the empty list that makes sure we clear the
# list if none of the checkboxes are ticked
if params.has_key?(:imode_ids)
imodes = Mode.find(params[:imode_ids])
else
imodes = []
end
@system.imodes = imodes
繰り返しますが、すべてうまくいきますが、その厄介なコードをコントローラーの他のメソッドにコピーする必要があります。可能であれば、もっと魔法のようなものを使用したいと思います。私は、きれいな Rails コードの道を通り過ぎて、Rails の「ハッキング」の森に入っているような気がします。それは機能しますが、私はそれが好きではありません。私は何をすべきでしたか?