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

这很好用,我可以按Modes预期分配列表。imodesomodes

我想做的是accepts_nested_attributes_for在模型中使用或其他一些类似的魔法,System并用一组复选框构建一个视图。

Modes给定的有效集合在System别处定义。我在_form视图中使用复选框来选择实际设置在imodes和中的有效模式omodes。我不想Modes从此视图创建新的,只需从预定义的列表中选择Modes

以下是我目前正在使用的_form视图。它生成一个复选框列表,每个复选框都允许ModeSystem编辑。如果选中该复选框,则该复选框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