我正在尝试允许在帖子中使用我的模型提交嵌套属性。我正在使用RubyMine作为我的IDE,在调试时,我能够看到正在发布的正确值,但我无法弄清楚它们在@model
中设置的是什么。
模型
class Product < ActiveRecord::Base
has_many :product_prices
accepts_nested_attributes_for :product_prices, allow_destroy: true
end
class ProductPrice < ActiveRecord::Base
belongs_to :product
end
查看代码
<%= form_for :model, url: products_path do |f| %>
<p>
<%= f.label :name %><br/>
<%= f.text_field :name %>
</p>
<table>
<%= f.fields_for :product_prices do |ff| %>
<tr>
<td><%= ff.text_field :start_date %></td>
<td><%= ff.text_field :end_date %></td>
<td><%= ff.text_field :price %></td>
<td><%= ff.check_box :_destroy %></td>
</tr>
<% end %>
</table>
<%= link_to 'Go Back', products_url %>
<%= f.submit 'Create' %>
<% end %>
控制器(已更新!)
def create
@model = Product.new(product_params)
if @model.save
redirect_to @model
else
render 'new'
end
end
private
def product_params
params.require(:model).permit(:id, :name, :description, :is_active, product_prices_attributes: [:id, :product_id, :start_date, :end_date, :price, :_destroy])
end
修改 以下是我的参数结构:
{
"utf8"=>"✓",
"authenticity_token"=>"Hu+mTRWtTLz3wvPOPPw/OdkP1DWqneT2bR+mc2LlWe0eFX9LOYjB28005gjIcRDn3JskV4d7V+2IojIalyQc2A==",
"model"=>{
"name"=>"SENATE BILL OLTEST",
"description"=>"sdfasd",
"is_active"=>"1",
"product_prices"=>{
"start_date"=>"1/1/2013",
"end_date"=>"",
"price"=>"15.00",
"_destroy"=>"0"
}
},
"commit"=>"Create"
}
答案 0 :(得分:0)
我认为问题源于在控制器更新操作中急切加载product_prices。我依旧记得在过去遇到过类似的问题,但我找不到任何相关文档。变化:
@model = Product.includes(:product_prices).find(params[:id])
要:
@model = Product.find(params[:id])
看看是否有效。
答案 1 :(得分:0)
你的产品参数应采用私人方式..
private
def product_params
params.require(:model).permit(:id, :name, :description, :is_active, product_prices_attributes: [:id, :product_id, :start_date, :end_date, :price, :_destroy])
end
product_prices和product_prices_attributes也不一样
答案 2 :(得分:0)
我的代码存在一些问题
form_for :model
我应该form_for @model
我的product_params
应该是:
params.require(:product).permit(:id, :name, :description, :is_active, {:product_prices_attributes => [:id, :product_id, :start_date, :end_date, :price, :_destroy]})`