代码之家  ›  专栏  ›  技术社区  ›  Ola Tuvesson

路由到未保存父级的嵌套模型/窗体

  •  0
  • Ola Tuvesson  · 技术社区  · 15 年前

    class Listing < ActiveRecord::Base
      has_many :schedules, :dependent => :destroy
      accepts_nested_attributes_for :schedules, :allow_destroy => true, :reject_if => :all_blank
      ...
    end
    
    class Schedule < ActiveRecord::Base
      belongs_to :listing
      ...
    end
    

    由于计划表单的复杂性,我不想为计划的字段\u中的每个项目显示它,因此这些仅包含一个标题和一个删除链接(以及一堆其他参数的隐藏字段)。

    form_for([@listing, @schedule], :remote => true) do |f| 
    

    这在编辑现有列表时非常有效,但用于构建复杂日程表单的表单\u会覆盖在新列表上:

     => No route matches {:action=>"create", :controller=>"schedules")
    

    在我的路线中,我有(Rails 3):

    resources :listings do
      resources :schedules
    end
    

    谢谢你的建议。

    编辑:

    我应该补充一下,我正在Listings控制器的new和edit方法中构建新的Schedule实例,如下所示:

    def new
      @listing = Listing.new
      @schedule = @listing.schedules.build
    end
    
    def edit
      @listing = Listing.find(params[:id])
      @schedule = @listing.schedules.build
    end
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   jasonpgignac    15 年前

    默认情况下,您不能使用窗体\u for在新父对象下执行嵌入对象,因为控制器无法返回新对象的子对象,因为您无法将子对象分配给没有id的对象。您必须设置自定义路由。不过,在概念上,对我来说,这个限制是有意义的——您没有请求应用程序返回新对象的子对象,因为在生成对象之前无法生成子对象,所以您可以调用非嵌入路由,只需为(@schedule)生成\u。然后,只需将整个构建树作为一个对象返回,就可以将所有构建树一起保存。您必须将其嵌入到最终的save请求中,直到那时,才没有嵌入的对象。