1

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

それはうまく機能し、意図したとおりにリストを割り当てることができますModesimodesomodes

私がやりたいのaccepts_nested_attributes_forは、モデルでまたは他のそのような魔法を使用Systemして、チェックボックスのセットでビューを構築することです。

Modes特定の有効なセットは、別のSystem場所で定義されています。ビューでチェックボックスを使用して、と_formで実際に設定されている有効なモードを選択しています。このビューから新規作成するのではなく、事前定義された のリストから選択するだけです。imodesomodesModesModes

以下は、私が現在私の_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 の「ハッキング」の森に入っているような気がします。それは機能しますが、私はそれが好きではありません。私は何をすべきでしたか?

4

0 に答える 0