Rails 6:不允许的参数(多对多)
Rails 6: Unpermitted Parameter (many-to-many)
RAILS 6
嘿,我正在开发一个 class 系统,该系统使用单位和分配作为多对多关系。当我提交带有单位下拉集合的新分配表时,控制器未收到该单位,但未显示错误日志。当我使用byebug时,出现如下错误:
Unpermitted parameter: :unit_ids
虽然已经被允许了。这是我的作业控制器。
class AssignmentsController < ApplicationController
def new
@assignment = Assignment.new
end
def create
debugger
@assignment = Assignment.new(assignment_params)
@assignment.save
if @assignment.save
flash[:success] = "The unit was successfully submitted."
redirect_to units_path
else
render 'new'
end
end
def show
end
private
def assignment_params
params.require(:assignment).permit(:name, :description, :duedate, user_ids: [])
end
end
使用 byebug,我知道 unit_id 被正确接收,从这个表格:
<%= form_for(@assignment, :html => {class: "form-horizontal", role: "form"}) do |f| %>
<div class="form-group">
<div>
<%= f.collection_select(:unit_ids, Unit.all, :id, :name, placeholder: "Units" )%>
</div>
<div>
<%= f.text_field :name, class:"form-control", placeholder: "Title of Assignment", autofocus: true %>
</div>
<div>
<%= f.text_area :description, class:"form-control materialize-textarea", placeholder: "Assignment Description", autofocus: true %>
</div>
<div>
<%= f.text_field :duedate, class: "datepicker", placeholder: "Due Date"%>
</div>
<div class="form-group" id="submitbutton">
<div align = "center">
<%= f.submit class: "btn waves-effect waves-light" %>
</div>
</div>
</div>
<%end%>
为了安全起见,这里列出了相关模型。请注意,我在收到此错误后将嵌套行添加到两者中,因为我在另一个线程上看到了它,但它似乎并没有修复它。
class Unit < ApplicationRecord
has_and_belongs_to_many :users
has_and_belongs_to_many :assignments
accepts_nested_attributes_for :assignments
end
以及分配模型:
class Assignment < ApplicationRecord
has_and_belongs_to_many :units
has_many :users, :through => :units
accepts_nested_attributes_for :units
end
您必须更新允许的参数
def assignment_params
params.require(:assignment).permit(:name, :description, :duedate, user_ids: [], unit_ids: [])
end
你提到这是允许的,但我在允许的参数中没有看到 unit_ids
,我确实看到了 user_ids
。有拼写错误吗?还是只需要在其中包含 unit_ids
?
答案是多种因素的结合,正如罗克韦尔指出的那样,我使用的是用户而不是单位,但这仍然没有解决问题。我的 collection 有多个选项设置为 false,所以我的控制器只需要
params.require(:assignment).permit(:name, :description, :duedate, :unit_ids)
但是,当我将 multiple 设置为 true 时,它不起作用。然后,它想要
params.require(:assignment).permit(:name, :description, :duedate, unit_ids[])
我的解决方案是保留 multiple 为真,并使用 unit_ids[].
unit_ids
不是列名。您可以使用 accept_nested_attribute
或 form object
来解决此问题。
RAILS 6
嘿,我正在开发一个 class 系统,该系统使用单位和分配作为多对多关系。当我提交带有单位下拉集合的新分配表时,控制器未收到该单位,但未显示错误日志。当我使用byebug时,出现如下错误:
Unpermitted parameter: :unit_ids
虽然已经被允许了。这是我的作业控制器。
class AssignmentsController < ApplicationController
def new
@assignment = Assignment.new
end
def create
debugger
@assignment = Assignment.new(assignment_params)
@assignment.save
if @assignment.save
flash[:success] = "The unit was successfully submitted."
redirect_to units_path
else
render 'new'
end
end
def show
end
private
def assignment_params
params.require(:assignment).permit(:name, :description, :duedate, user_ids: [])
end
end
使用 byebug,我知道 unit_id 被正确接收,从这个表格:
<%= form_for(@assignment, :html => {class: "form-horizontal", role: "form"}) do |f| %>
<div class="form-group">
<div>
<%= f.collection_select(:unit_ids, Unit.all, :id, :name, placeholder: "Units" )%>
</div>
<div>
<%= f.text_field :name, class:"form-control", placeholder: "Title of Assignment", autofocus: true %>
</div>
<div>
<%= f.text_area :description, class:"form-control materialize-textarea", placeholder: "Assignment Description", autofocus: true %>
</div>
<div>
<%= f.text_field :duedate, class: "datepicker", placeholder: "Due Date"%>
</div>
<div class="form-group" id="submitbutton">
<div align = "center">
<%= f.submit class: "btn waves-effect waves-light" %>
</div>
</div>
</div>
<%end%>
为了安全起见,这里列出了相关模型。请注意,我在收到此错误后将嵌套行添加到两者中,因为我在另一个线程上看到了它,但它似乎并没有修复它。
class Unit < ApplicationRecord
has_and_belongs_to_many :users
has_and_belongs_to_many :assignments
accepts_nested_attributes_for :assignments
end
以及分配模型:
class Assignment < ApplicationRecord
has_and_belongs_to_many :units
has_many :users, :through => :units
accepts_nested_attributes_for :units
end
您必须更新允许的参数
def assignment_params
params.require(:assignment).permit(:name, :description, :duedate, user_ids: [], unit_ids: [])
end
你提到这是允许的,但我在允许的参数中没有看到 unit_ids
,我确实看到了 user_ids
。有拼写错误吗?还是只需要在其中包含 unit_ids
?
答案是多种因素的结合,正如罗克韦尔指出的那样,我使用的是用户而不是单位,但这仍然没有解决问题。我的 collection 有多个选项设置为 false,所以我的控制器只需要
params.require(:assignment).permit(:name, :description, :duedate, :unit_ids)
但是,当我将 multiple 设置为 true 时,它不起作用。然后,它想要
params.require(:assignment).permit(:name, :description, :duedate, unit_ids[])
我的解决方案是保留 multiple 为真,并使用 unit_ids[].
unit_ids
不是列名。您可以使用 accept_nested_attribute
或 form object
来解决此问题。