我的控制器没有正确保存数组参数。
数据库

|categories|
 |id| |name|
   1    HW
   2    SF
   3    PC

|products|
 |id| |amount| |category_id|

但是在保存表'products'之后,应该保存数组参数
会像这样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)

正在保存不正确的信息(不正确的参数)
有人能帮我吗?

最佳答案

您正在尝试同时创建多个记录,但您正在尝试使用一个调用来创建这一点非常重要!!!在您的new操作中,您只向DB请求一个对象这很好,我想可以得到所需的表单字段,因为您使用Controller#new来完成所需的循环数但在你的行动中你做到了:

 obj_product.new(params[:obj_product])

你可以试试:
 obj_product.create(params[:obj_product])

但这不起作用,因为你的情人是:
"flow_budget_detail"=> {"1"=>{"amount"=>"100"},"2"=>{"amount"=>"300"},,"2"=>{"amount"=>"300"} }

如果要执行此操作,必须在提交@categories操作之前创建所有@obj_产品。这样,如果有3个类别相关联,您将向表单传递3个产品对象,然后表单将返回一个非常不同的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

好吧,这应该是一字不差的。不要去更改Controller#create中的键,因为这是您得到错误结果的原因之一。也不要改变“new”(“category\u id”=>k,“amount”=>v)的顺序,因为你的顺序与我上次告诉你的相反,这也搞砸了你的结果。
准确地做这个并发布结果。

关于ruby-on-rails - 如何使用 Controller 保存数组参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31887516/

10-11 22:26
查看更多