父表单中的嵌套资源创建

时间:2014-07-17 20:20:58

标签: ruby-on-rails ruby nested-resources

我有一个名为Quote的班级has_many :line_items, as: :line_itemableline_items是多态的)。报价创建时必须至少有一个line_item,因此在我的报价创建表单中,我有一个专门用于添加订单项的部分。我的路线看起来像这样:

resources :quotes, shallow: true do
  resources :line_items
end

这意味着我的路线如下所示:

                     POST  /quotes/:quote_id/line_items(.:format)      line_items#create
new_quote_line_item  GET   /quotes/:quote_id/line_items/new(.:format)  line_items#new

在报价表单的行项目部分,我有一个按钮,当单击该按钮时,链接到new_quote_line_item控制器操作以呈现line_item创建模式。我的问题是,由于报价尚未创建,但它没有:quote_id在路径中使用。我怎样才能实现Rails Way™?我正在考虑使用ajax,但我不确定这种情况是否过度。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

您应该在模型中使用 accepts_nested_attributes_for 方法接受LineItem和 fields_for 帮助程序的属性

您的模型应如下所示:

class Quote < ActiveRecord::Base
    accepts_nested_attributes_for :line_item
    ...
end

你的模板如:

form_for @quote do |f|
    f.fields_for :line_items do |f2|
       ...
    end
    ...
end

答案 1 :(得分:1)

<强>的Ajax

您不需要ajax功能 - Ajax只允许您从服务器异步提取数据,这实际上意味着您不必重新加载页面。 / p>

-

嵌套属性

atomAltera听起来像accepts_nested_attributes_for所提到的那样,你可以从父母那里创建dependent模型

在我尝试填充quote之前,您需要先创建一个line_items,这实际上很简单ActiveRecord

#app/models/quote.rb
Class Quote < ActiveRecord::Base
   has_many :line_items
   accepts_nested_attributes_for :line_items
end

#app/controllers/quotes_controller.rb
Class QuotesController < ApplicationController
    def new
       @quote = Quote.new
       @quote.line_items.build
    end

    def create
       @quote = Quote.new(quote_params)
       @quote.save
    end

    private

    def quote_params
        params.require(:quote).permit(:quote, :attributes, :new, line_items_attributes: [:line, :items, :attributes])
    end
end

-

如果您需要任何进一步的信息,请告诉我!!