在 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
被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 的森林;它有效,但我不喜欢它。我应该怎么做?