我的控制器未正确保存数组参数。
数据库
|categories|
|id| |name|
1 HW
2 SF
3 PC
|products|
|id| |amount| |category_id|
但在保存表格后,应该保存数组参数 将是这样的demo
|products|
|id| |amount| |category_id|
1 100 1
2 200 2
3 300 3
控制器:
def new
@categories = Category.all
@obj_product = Product.new(params[:obj_product])
end
def create
params[:obj_product].each do |key , value|
o = FlowBudgetDetail.new( :amount => value , :category_id => key)
o.save
end
if o.save()
redirect_to :action=>"index"
else
redirect_to :action=>"new"
end
end
查看:
<% form_for :obj_product, :url => {:action=>'create'} do |f| %>
<% @categories.each do |category| %>
<%= f.text_field :category_id , :name => "obj_product[array_#{category.id}][category_id]"%>
<%= f.text_field :amount , :name => "obj_product[array_#{category.id}][amount]" %>
<% end %>
<$ end %>
日志显示所有参数,但只是创建一个插入:
Processing ProductController#create (for 127.0.0.1 at 2015-08-07 17:23:26) [POST]
Parameters: {"commit"=>"Save", "obj_product"=> {"array_1"=>{"amount"=>"100","category_id"=>"1"},"array_2"=>{"amount"=>"300","category_id"=>"2"},"array_3"=>{"amount"=>"300","category_id"=>"3"} }}
INSERT INTO `products` (`category_id`, `amount`) VALUES( 0, 1)
INSERT INTO `products` (`category_id`, `amount`) VALUES( 0, 1)
INSERT INTO `products` (`category_id`, `amount`) VALUES( 0, 1)
这应该保存:
INSERT INTO `products` (`category_id`, `amount`) VALUES( 1, 100)
INSERT INTO `products` (`category_id`, `amount`) VALUES( 2, 200)
INSERT INTO `products` (`category_id`, `amount`) VALUES( 3, 300)
保存不正确的信息(不正确的参数)
请有人帮助我吗?
答案 0 :(得分:3)
您正尝试一次创建多个记录,但是您尝试使用一次调用new
来执行此操作这很重要!!! 在您的Controller#new
操作中你只问DB一个对象。这很好我想要获得你需要的表单字段,因为你使用@categories
来完成所需的循环次数。但是在你的Controller#create
行动中:
obj_product.new(params[:obj_product])
你可以尝试:
obj_product.create(params[:obj_product])
但这不起作用,因为你的参数是:
"flow_budget_detail"=> {"1"=>{"amount"=>"100"},"2"=>{"amount"=>"300"},,"2"=>{"amount"=>"300"} }
如果你想这样做,你必须在Controller#new
行动之前创建所有@obj_products。这样,如果有3个类别关联,您将三个Product对象传递给表单,然后返回一个非常不同的params哈希。你的params hash必须看起来像:
[{"category_id" => "1", "amount"=>"100"},{"category_id" => "2", "amount"=>"200",...}]
但除非你重写你的控制器和形式不起作用。你可以这样做:
def create
if FlowBudgetDetail.transaction do
params["flow_budget_details"].each do |k,v|
new_record = FlowBudgetDetail.new("category_id" => k, "amount" => v)
new_record.save
end
end
redirect_to :action=>"index"
else
redirect_to :action=>"new"
end
end
好的,这应该是逐字的。不要更改params["flow_budget_details"].each
中的密钥,因为这是导致错误结果的一个原因。也不要改变`.new(“category_id”=&gt; k,“amount”=&gt; v)'的顺序,因为你从我上次告诉你的那个时候做了倒退,这也搞砸了你的结果。
完成此操作并发布结果。