ruby-on-rails - 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"=>"✓", "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 上的位置。
解决方案
看起来您传入的过滤器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
推荐阅读
- angular - 如何使用可选路径前缀定义角度路径
- python - 当监视目录中的文件更改时,使用看门狗和 tkinter 打开 GUI 对话框
- angular - 如何为 Angular 路由参数管道设置加载指示器*
- android - 我的图书馆的 RecyclerView 如何让其客户自定义行的呈现方式?
- python - 样本数不一致
- javascript - Web 组件元素单击事件侦听器不起作用
- python - 如何在 Spyder 中禁用括号自动完成?
- bash - Linux:循环从文件中读取 url,从命令行打开它,然后等待指定的时间,然后关闭 Web 浏览器
- java - Java Runtime 7u51 不支持 DPI?
- python - 用 levenahtein 将大文件聚类到 3 个组