路由到未保存父级的嵌套模型/表单

时间:2010-07-17 17:38:37

标签: ruby-on-rails forms routing model nested

我有一个复杂的表单,用于属于父列表模型的模型Schedule:

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

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

相反,复杂表单用于异步生成每个Schedule的新表单字段,然后将其插入到父表单中。这只是发布的Schedule表单(使用部分_new_schedule_fields)的响应,该表单附加到Listing表单的fields_for(:schedules)部分。然后,在保存列表时自动创建子计划,因为它接受了schedule_attributes_for计划。对Schedule表单的调用如下所示(位于页面中的form_for列表之后):

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

在编辑现有的清单时,这非常有效,但用于构建复杂的Schedule表单的form_for会落在新的清单上:

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

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

resources :listings do
  resources :schedules
end

这当然很有道理,因为预期的路径是/ listings /:listing_id / schedules / new但是我想知道是否有办法使用form_for构建器为属于未保存的嵌套模型生成表单家长吗? / listings / new / schedule / new似乎很荒谬,但完美地总结了我的追求!

感谢任何有用的建议。

编辑:

我应该补充一点,我正在为清单控制器的新方法和编辑方法构建新的Schedule实例,如下所示:

def new
  @listing = Listing.new
  @schedule = @listing.schedules.build
end

def edit
  @listing = Listing.find(params[:id])
  @schedule = @listing.schedules.build
end

1 个答案:

答案 0 :(得分:1)

默认情况下,不能使用form_for在新父项下执行嵌入对象,因为控制器无法返回作为新对象子项的对象,因为您无法将子项分配给没有id的对象。您必须设置自定义路线。但从概念上讲,这个限制是有道理的 - 你不是要求应用程序返回你的新对象的孩子,因为在你制作这个对象之前你不能生孩子,所以你称之为非嵌入式route,只是form_for(@schedule)。然后,只需将整个构建树作为一个对象返回,以便将它们全部保存在一起。您必须将其嵌入到最终保存请求中,直到那时,没有嵌入对象。