通过Rails中的多个选择连接表的未允许参数

时间:2017-06-19 23:57:54

标签: ruby-on-rails ruby forms nested-forms multiple-select

在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个可能的专业。

2 个答案:

答案 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并相应地调整您的formexpertise_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