代码之家  ›  专栏  ›  技术社区  ›  Bryce

rails控制器/表单-在哪里构建嵌套模型?

  •  0
  • Bryce  · 技术社区  · 12 年前

    在我的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 函数,在控制器中,在装饰器中,等等。?

    1 回复  |  直到 12 年前
        1
  •  1
  •   DigitalCora    12 年前

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

    # 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 ).