ruby-on-rails - 如何使用 Controller 保存数组参数?

标签 ruby-on-rails arrays ruby

我的 Controller 未正确保存数组参数。

数据库

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

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

But after saving the table 'PRODUCTS', should save array params will be like this demo

|products|
 |id| |amount| |category_id|
   1     100          1
   2     200          2
   3     300          3

Controller :

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的一次调用来完成此操作这很重要!!!在您的中Controller#new 操作您只向数据库请求一个对象。我想获取您需要的表单字段很好,因为您正在使用 @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 对象,然后表单将返回一个非常不同的参数哈希值。您的参数哈希必须如下所示:

[{"category_id" => "1", "amount"=>"100"},{"category_id" => "2", "amount"=>"200",...}]

但是除非您重写 Controller 和表单,否则它将无法工作。你可以这样做:

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"=> k, "amount"=> v)' 的顺序,因为你把它从我上次告诉你的内容倒退了,这也搞砸了你的结果。

严格执行此操作并发布结果。

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

相关文章:

ruby-on-rails - 复合模型名称问题

ruby-on-rails - 推送到heroku,sqlite3时出现Ruby on Rails错误

ruby-on-rails - Ruby on Rails : Nested Attributes,归属关系

c - 如何检查是否将小于 'n' 的数字输入到包含大小 n 的数组中?

php - 将数据数组作为电子邮件发送

arrays - Fortran中多维数组的线性索引

jquery - 在成功调用 ajax 后呈现部分内容?

ruby - Active Record - 查找今天之前创建的记录

ruby-on-rails - 设置 http header RSpec 2.4/Rails 3

ruby - 无法在 capybara 中选择选项