0

在我的 Rails 应用程序中,我有一些表单可以接受新对象的嵌套模型。例如:

class Maker < ActiveRecord::Base
  has_many :cars
  accepts_nested_attributes_for :cars
end

class Car < ActiveRecord::Base
  belongs_to :maker
end

不过,在显示该表单之前,我需要为我的 Maker 模型构建一些嵌套模型,否则它们不会显示在表单中。例如:

maker = Maker.new
3.times do
  maker.cars.build
end

但是这段代码理想情况下应该去哪里呢?在模型中作为自己的form_display功能,在控制器中,在装饰器中等等?

4

1 回答 1

1

这个问题的答案将有点基于意见。从关注点分离的角度来看,如果您已经在项目中使用了装饰器,那么将逻辑放在那里可能比放在控制器或模型中更有意义。

# maker_decorator.rb
def cars
  if object.new_record? && object.cars.none?
    3.times { object.cars.build }
  end

  object.cars
end

如果您不想处理装饰器,将逻辑放在控制器中似乎是一种合理的方法(只要它不会在多个操作中重复)。

# makers_controller.rb
def new
  @maker = Maker.new
  3.times { @maker.cars.build }
end

我不会添加模型代码来处理此功能,因为这是模型和视图问题的相当明显的混合,尽管任何使用accepts_nested_attributes_for都会使您走上这条路。“表单对象”避免了这个问题,尽管在你的情况下这可能是一个重量级的解决方案,而且目前这种模式的已建立的库或约定很少(参见这篇博文中的#3)。

于 2013-09-27T02:14:54.140 回答