ruby-on-rails - 保存 Rails 4 对象的集合(强参数)

标签 ruby-on-rails ruby ruby-on-rails-4 strong-parameters active-relation

我目前正在商店后端工作。客户希望能够查看所有产品的列表,并在一次提交的表单中更新所有产品的库存值(value)。我有一个可行的解决方案,但它非常“hacky”并且引入了很多问题。我对 Ruby on Rails 和 Web 开发总体来说是新手,所以我仍在学习一些基本约定以及其他一些内容。

我将粘贴我的工作解决方案,然后尝试解释我遇到的问题:

class Product < ActiveRecord::Base
   has_many :stocks
   ...
end

class Stock < ActiveRecord::Base
   belongs_to :product
   ...
end

stock_controller.rb

class StocksController < ApplicationController

  def index
    @products = Product.all.includes(:stocks)
  end
...
  def update_current      
    @stock_params = params[:stock]
    @stock_params.each do |stock_params|
      params.permit(:current_stock, :product_id)
      @stock = Stock.new(stock_params)
      @stock.save
  end
    redirect_to stocks_path, notice: 'Stocks were successfully updated'
 end        
...

stocks.index.html.erb

...
<%= form_tag url_for(:action => 'update_current') do |f| %>
  <% @products.each do |product| %>
    <tr>
      <td><%= product.product_name %></td>
      <td><%= product.minimum_stock %></td>
      <td><%= text_field_tag "stock[][current_stock]", product.stocks.last.current_stock %></td>
  <%= hidden_field_tag "stock[][product_id]", product.stocks.last.product_id %>
    </tr>
    <% end %>
  <%= submit_tag 'save' %>
 <% end %>
...

当我点击提交按钮时,参数设置是需要的:

控制台:

Started POST "/stocks/update_current" for 127.0.0.1 at 2013-10-24 11:54:03 +0100
Processing by StocksController#update_current as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"NlabBuwI06t+YN5O6p7dm+Zg2Bwc9uXrKUdWaBqNs9w=", "stock"=>[{"current_stock"=>"1", "product_id"=>"1"}, {"current_stock"=>"2", "product_id"=>"2"}, {"current_stock"=>"3", "product_id"=>"24"}, {"current_stock"=>"4", "product_id"=>"25"}, {"current_stock"=>"5", "product_id"=>"23"}, {"current_stock"=>"6", "product_id"=>"21"}, {"current_stock"=>"7", "product_id"=>"19"}, {"current_stock"=>"8", "product_id"=>"22"}, {"current_stock"=>"9", "product_id"=>"5"}], "commit"=>"save"}
Unpermitted parameters: utf8, authenticity_token, stock, commit
 (0.2ms)  BEGIN
SQL (136.6ms)  INSERT INTO "stocks" ("created_at", "current_stock", "product_id", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", Thu, 24 Oct 2013 10:54:03 UTC +00:00], ["current_stock", 1], ["product_id", 1], ["updated_at", Thu, 24 Oct 2013 10:54:03 UTC +00:00]]
(24.2ms)  COMMIT
Unpermitted parameters: utf8, authenticity_token, stock, commit
(0.2ms)  BEGIN
SQL (0.7ms)  INSERT INTO "stocks" ("created_at", "current_stock", "product_id", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", Thu, 24 Oct 2013 10:54:03 UTC +00:00], ["current_stock", 2], ["product_id", 2], ["updated_at", Thu, 24 Oct 2013 10:54:03 UTC +00:00]]
(0.7ms)  COMMIT
Unpermitted parameters: utf8, authenticity_token, stock, commit
(0.1ms)  BEGIN
SQL (0.4ms)  INSERT INTO "stocks" ("created_at", "current_stock", "product_id",      "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", Thu, 24 Oct 2013  10:54:03 UTC +00:00], ["current_stock", 3], ["product_id", 24], ["updated_at", Thu, 24 Oct  2013 10:54:03 UTC +00:00]]
  (0.6ms)  COMMIT

正如您从日志中看到的那样,authenticity_token 和其他参数是不允许的。现在我明白了 token 和其他参数的用途,我不知道什么,为什么我会遇到这个问题。

我的猜测是我允许参数的方式。我不知道如何告诉 Strong_params 允许哈希数组:stock => [{:current_stock, :product_id},{:current_stock, :product_id}, ..., ....]。 params.permit(stock: [:current_stock, :product_id]) ???

在这种情况下,将库存嵌套在产品下是没有意义的,因为我正在处理一系列产品而不是单个产品。

在理想的情况下,我希望能够在一次提交中插入所有产品的新库存值,并通过一次查询将其保存到数据库中。我觉得 Ajax 可能是一个可行的解决方案,但同样,在我完全理解发生了什么之前,我不想让事情变得更加困惑。

非常感谢任何解决方案或建议。我希望以上说得有道理!有时很难清楚地表达这些事情。

最佳答案

这可能是也可能不是您的问题,但在您的 update_current 方法中,不应该是 stock_params.permit(:current_stock, :product_id) 吗?还有一个小问题,如果您不使用 |f| ,为什么在您的 form_tag 中使用它。

关于ruby-on-rails - 保存 Rails 4 对象的集合(强参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19565183/

相关文章:

ruby-on-rails - rails 生成模型 Investor - 收到错误 "The name ' Investor' 要么已经使用...”

ruby-on-rails - 更新任何属性后回形针图像名称更改

ruby - 字符串连接错误

ruby - Twilio:查找调用或 session 的 SID

postgresql - 如何通过查看数据库表中的时间来触发函数

ruby-on-rails-4 - Rollbar 处理项目时出错:Net::OpenTimeout,执行已过期

ruby-on-rails - 如何向 jbuilder 索引页添加额外的属性

jquery - RoR - 如何在下拉列表中添加图标

ruby-on-rails - 访问存储在使用 #create_join_table 创建的连接表中的连接模型属性

ruby-on-rails - rails 3/ActiveRecord : How to switch/change table name during request dynamically?