首页 > 解决方案 > Rails 5 项目中不允许的参数

问题描述

我花了几个小时试图在我拥有的 Rails 5 项目中解决这个问题。问题是我不断得到:

不允许的参数::item_instance_ids,:note_ids

当我提交表格时。我认为模型之间的关系是错误的。我正在使用多态关系,这是我第一次使用它。我浏览了 StackOverFlow 上的很多帖子以及网络上的指南,但似乎没有任何帮助。

基本上,我有一个收到的采购表格 - 就像一个订购表格,在该表格中,您应该能够将多个项目(如笔记本电脑、键盘、显示器)添加到订单 => 项目实例模型。

无论如何,这是我的代码:

incoming_purchases.rb

class IncomingPurchase < ApplicationRecord

  # Relations
  has_many :item_instance, :as => :instance_wrapper
  has_many :notes, :as => :notable
  belongs_to :user


end

item_instance.rb

class ItemInstance < ApplicationRecord

    # Relations
    belongs_to :instance_wrapper, polymorphic: true
    belongs_to :item
    belongs_to :user
    has_many :notes, :as => :notable
end

views/incoming_purchases/_form.html.erb

<%= simple_form_for(@incoming_purchase) do |f| %>

  <%= f.error_notification %>
  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

  <div class="form-inputs">

    <%= f.association :item_instance, as: :check_boxes, :label_method => lambda { |item_instance| "#{item_instance.item.description}" } %>
    <%= f.label(:date_ordered, "Order Date:") %>
    <%= f.text_field(:date_ordered, class: 'form-control-date')  %>
    <%= f.association :user, :label_method => lambda { |user| "#{user.username}" }  %>
    <%= f.input :order_number %>
    <%= f.input :vendor %>
    <%= f.input :po_number %>
    <%= f.input :tax %>
    <%= f.input :shipping %>
    <%= f.association :notes %>
  </div>

  <div class="form-actions">
    <%= f.button :submit, class: "btn btn-outline-success" %>
  </div>

<% end %>

incoming_puchases_controller.rb

class IncomingPurchasesController < ApplicationController
  before_action :set_incoming_purchase, only: [:show, :edit, :update, :destroy]

  def new
    @incoming_purchase = IncomingPurchase.new
  end

  def create
    puts '*********************'
    puts params
    puts '*********************'
    puts incoming_purchase_params
    puts '**********************'
    @incoming_purchase = IncomingPurchase.new(incoming_purchase_params)

    respond_to do |format|
      if @incoming_purchase.save
        format.html { redirect_to @incoming_purchase, notice: 'Incoming purchase was successfully created.' }
        format.json { render :show, status: :created, location: @incoming_purchase }
      else
        format.html { render :new }
        format.json { render json: @incoming_purchase.errors, status: :unprocessable_entity }
      end
    end
  end

  private
 
  def set_incoming_purchase
   @incoming_purchase = IncomingPurchase.find(params[:id])
  end

  def incoming_purchase_params
    params.require(:incoming_purchase).permit(:item_instances_id, :date_ordered, :user_id,   :order_number, :vendor, :po_number, :tax, :shipping, :notes_id)
  end

end 

schema.rb

ActiveRecord::Schema.define(version: 2020_08_31_200026) do
  create_table "incoming_purchases", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
    t.bigint "item_instances_id"
    t.date "date_ordered"
    t.bigint "user_id"
    t.string "order_number"
    t.string "vendor"
    t.integer "po_number"
    t.decimal "tax", precision: 8, scale: 2
    t.decimal "shipping", precision: 8, scale: 2
    t.bigint "notes_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["item_instances_id"], name: "index_incoming_purchases_on_item_instances_id"
    t.index ["notes_id"], name: "index_incoming_purchases_on_notes_id"
    t.index ["user_id"], name: "index_incoming_purchases_on_user_id"
  end

  create_table "item_instances", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
    t.integer "inv_number"
    t.string "serial"
    t.integer "po_number"
    t.date "po_date"
    t.date "invoice"
    t.date "date_out"
    t.decimal "cost", precision: 8, scale: 2
    t.string "acro"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "item_id"
    t.index ["item_id"], name: "fk_rails_6ea33fd9d0"
  end

  add_foreign_key "incoming_purchases", "item_instances", column: "item_instances_id"

end 

哦,在我试过的控制器上:

params.require(:incoming_purchase).permit({ :item_instance_ids => [] }, :date_ordered, :user_id, :order_number, :vendor, :po_number, :tax, :shipping, :notes_id)

同样,我认为问题在于这两个模型之间的关系是如何建立的。感谢您的任何帮助。

我尝试将我的许可参数更改为以下内容:

params.require(:incoming_purchase).permit(:item_instances_id, :date_ordered, :user_id, :order_number, :vendor, :po_number, :tax, :shipping, notes_id: [], item_instances_id: [])

我能够添加一个项目,但当然 item_instances_id 没有通过。当参数通过时,它看起来像这样:

{"utf8"=>"✓&quot;, "authenticity_token"=>"d3jF73WyKCs69RSCFDvQlh7RyUAg0GQk8m7GKHX6/tt+Ve/1Y1oE5P1UtIMJfCIYS+YL0DwZth9UlDcnyW1uiA==", "incoming_purchase"=>{"item_instance_ids"=>["", "31"], "date_ordered"=>"2020-09-01", "user_id"=>"2", "order_number"=>"1", "vendor"=>"1", "po_number"=>"1", "tax"=>"1", "shipping"=>"1", "note_ids"=>[""]}, "commit"=>"Create Incoming purchase", "controller"=>"incoming_purchases", "action"=>"create"}

注意 item_instance_ids 然而,在incoming_purchases 模型上它的item_instances_id 注意那个s 在ids 和instances 上的位置。

标签: ruby-on-railsrubypolymorphismruby-on-rails-5associations

解决方案


看起来您传入的过滤器permit不正确。它可能需要,note_ids: []因为这是一种has_many关系。并且当将嵌套参数传递给它们时,permit它们应该放在最后。因此,您还必须移动item_instance_ids到最后,无论是 before 还是 after note_ids: []


编辑

has_many :though将商品与购买联系起来可能会更好。我不确定你的Item模型是什么样子的,所以我保持简单。

incoming_purchase.rb

class IncomingPurchase < ApplicationRecord
  has_many :purchase_items
  has_many :items, through: :purchase_items
end

purchase_item.rb

class PurchaseItem < ApplicationRecord
  belongs_to :incoming_purchase
  belongs_to :item
end

item.rb

class Item < ApplicationRecord
  has_many :purchase_items
  has_many :incoming_purchases, through: :purchase_items
end

推荐阅读