我有一个名为Quote
的班级has_many :line_items, as: :line_itemable
(line_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,但我不确定这种情况是否过度。谢谢你的帮助!
答案 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
-
如果您需要任何进一步的信息,请告诉我!!