Rails:创建父级,使用父级自己的视图,同时创建子级记录

时间:2010-10-30 01:07:00

标签: ruby-on-rails ruby-on-rails-3

虽然输入新记录(子)的一部分,但是不完整且无法保存,我希望能够将记录添加到另一个模型(父级),然后使用它来完成原始记录(儿童)。父级具有许多必需属性,而不仅仅是单个字段。我希望使用每个模型的新/创建视图和验证尽可能干燥。

我看到的示例都显示了如何使用accepts_nested_attributes_for在一个表单上输入父数据和子数据。我想反过来创建一个新的子项,然后使用父项自己的表单添加它们(如果它们尚不存在)。

例如此销售查询模型,其中包含多个父模型

class Enquiry < ActiveRecord::Base
  belongs_to :salesperson
  belongs_to :customer
  belongs_to :site
end

我想创建一个新查询并选择可能已经存在或可能不存在于数据库中的客户和站点。如果它们在数据库中,则自动完成将找到它们,否则我需要添加新的客户或站点。客户需要的不仅仅是输入名称等单个属性。它还需要其他详细信息,如地址,联系方式等。我不想将客户表单构建到查询表单中,因为我需要从应用程序的许多其他部分添加新客户。因此,我只想使用和维护一个客户表单:customer-&gt; new.html.erb。如果没有客户,则无法保存查询,因此我需要一种方法来保留部分输入的数据。

我可以想到两种方式来做。

  1. 存储在会话中部分输入的查询数据,打开新的客户视图,并在完成重定向后再返回查询表单并显示到目前为止输入的数据。

  2. 某种灯箱弹出窗口可以使用父模型的新视图,并且仍然可以在后台打开查询表单。

  3. 他们中的任何一个都有效吗?如果是这样,有人可以向我展示一些如何使其工作的示例代码吗?否则,还有另一种更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用相同的nested_attributes样式系统。

在表单中,您可以使用enquiry[customer_attributes][name]定义属性。在您只需要在查询模型中定义此属性

之后
class Enquiry < AR

  def customer_attributes=(params)
    self.customer = Customer.create(params)
  end
end

因此,如果有客户创建的参数。如果有查询[customer_id],则生成关联。

相关问题