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_attributeform object 来解决此问题。