在Rails 5中嵌套参数时遇到错误:Unpermitted parameter: specialties
我有专业模特:
class Expertise < ApplicationRecord
has_many :buckets, through: :specialties
has_many :specialties
end
Bucket模型:
class Bucket < ApplicationRecord
has_many :expertises, through: :specialties
has_many :specialties
end
专业模特:
class Specialty < ApplicationRecord
belongs_to :expertise
belongs_to :bucket
end
我正在尝试允许用户编辑他或她的专业知识并调整与他们相关的专业。 @buckets
从控制器传入,表单目前如下所示:
<%= form_for(expertise) do |f| %>
<%= f.fields_for :specialties do |s| %>
<%= s.collection_select :bucket_ids, @buckets, :id, :name, {}, { multiple: true, class: "input" } %>
<% end %>
<% end %>
我的表格基于this answer。
以下是ExpertisesController的相关摘录:
def expertise_params
params.require(:expertise).permit(:user_id, :name, :rating, :description, specialties_attributes: [:id, :expertise_id, :bucket_id, :_destroy, bucket_ids: []])
end
以下是传递的参数:
Parameters: {"expertise"=>{"specialties"=>{"bucket_ids"=>["", "1"]}, "description"=>""}, "id"=>"97"}
专业应该是阵列,对吧?我不知道该怎么做。
目的是让用户轻松地从可用的Buckets(@buckets
)中进行选择,以打开或关闭他或她的专业技能专长。因此,假设有5个桶可用,用户只能为该专业知识打开/关闭5个可能的专业。
答案 0 :(得分:1)
未经许可的参数:专业
您没有设置accept_nested_attributes_for
,因为该错误而吐出
class Expertise < ApplicationRecord
has_many :specialties
has_many :buckets, through: :specialties
accepts_nested_attributes_for :specialties
end
当我尝试时,嵌套的fields_for表单不会返回任何内容 专业,所以HTML元素是空的。然后,当我尝试使用 @ expertise.specialties.build,我得到未定义的方法bucket_ids 专业,因为bucket_ids实际上不是属性,但是 bucket_id是。值得记住的是用户需要能够 切换多个Specialties,每个Specialties都绑定到一个Bucket(通过一个 bucket_id),从我已经准备好的,我应该使用bucket_ids (复数)那里
您不需要复数形式( _ids )只是因为要接受多个值。只需保留 bucket_id
即可接受多个值。并且不要忘记在控制器中构建相关模型
def new
@expertise = Expertise.new
@ expertise.specialties.build
结束
在表单
bucket_ids
更改为bucket_id
&lt;%= s.collection_select:bucket_id,@ badets,:id,:name,{},{multiple:true,class:&#34; input&#34; }%&gt;
最后, expertise_params
应为
def expertise_params
params.require(:expertise).permit(:user_id, :name, :rating, :description, specialties_attributes: [:id, :expertise_id, :_destroy, bucket_id: []])
end
<强> 更新 强>
经过一些研究后,它看起来应该是bucket_ids
,但bucket_ids
应该允许作为expertise
的属性。检查此post并相应地调整您的form
和expertise_params
。你也不会需要accept_nested_attributes_for
!
答案 1 :(得分:0)
情况:专业知识has_many Buckets通过Specialties并且您想要更新特定专业知识的某些桶状态。所以你可以这样做:
class ExpertisesController < ApplicationController
def your_action
@expertise = Expertise.find params[:id]
bucket_ids = params[:expertise][:specialties][:bucket_ids]
@expertise.specialties.where(id: bucket_ids).update(status: :on)
end
end