这个问题的答案将在一定程度上基于意见。从关注点分离的角度来看,如果您已经在项目中使用了装饰器,那么将逻辑放在那里可能比放在控制器或模型中更有意义。
# maker_decorator.rb
def cars
if object.new_record? && object.cars.none?
3.times { object.cars.build }
end
object.cars
end
如果您不想处理decorator,那么将逻辑放在控制器中似乎是一种合理的方法(只要它不会在多个操作中重复)。
# makers_controller.rb
def new
@maker = Maker.new
3.times { @maker.cars.build }
end
我不会添加模型代码来处理此功能,因为这是模型和视图问题的明显混合,尽管
accepts_nested_attributes_for
会把你推下这条路。“表单对象”避免了这个问题,尽管在您的情况下,这可能是一个重量级的解决方案,而且目前几乎没有针对这种模式的已建立的库或约定(
see #3 in this blog post
).