【问题标题】:Unpermitted parameters for has_many :through nested form in Rails 5has_many 的不允许参数:通过 Rails 5 中的嵌套形式
【发布时间】:2017-02-24 10:08:30
【问题描述】:

您好,我正在尝试在我的 Rails 5 应用程序中实现 has_many :through 嵌套表单,以创建一个分配有用户的项目。但是,当我尝试创建项目时,遇到以下验证错误:

- Project users user company must exist
- Project users user email can't be blank
- Project users user email is invalid
- Project users user password can't be blank
- Project users user firstname can't be blank
- Project users user lastname can't be blank

这些是我为用户模型所做的验证,但我不明白为什么在我创建具有嵌套用户的项目时它们会出现。另外,控制台将 :fullname 指示为不允许的参数,如下所示。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"3RtrzKKVrSOiGLYnHwubF3GaRAbcQE/61doRM5clT8GpFYeJoEVnU2lEmQsNwVO8qecdqig8xjwbTqqaqL1gYQ==", "project"=>{"name"=>"dsada", "description"=>"dadasd", "project_users_attributes"=>{"0"=>{"user_attributes"=>{"fullname"=>["", "5", "4", "3"]}}},"choice"=>"1", "button"=>"", "company_id"=>"1"}
User Load (0.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
Company Load (0.3ms)  SELECT  "companies".* FROM "companies" WHERE "companies"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
Unpermitted parameter: fullname

谁能告诉我为什么我会遇到这些验证错误以及为什么全名被认为是不允许的,尽管我将它们包含在项目强参数中?我的代码如下所示。谢谢!

#Model - project.rb
class Project < ApplicationRecord
  has_many :project_users, inverse_of: :project
  has_many :users, through: :project_users
  accepts_nested_attributes_for :project_users
end

#Model - project_user.rb
class ProjectUser < ApplicationRecord
  belongs_to :project, inverse_of: :project_users
  belongs_to :user, inverse_of: :project_users
  accepts_nested_attributes_for :user
end

#Model - user.rb
class User < ApplicationRecord
  has_many :project_users, inverse_of: :user
  has_many :projects, through: :project_users
end

#Controller - projects_controller.rb
class ProjectsController < ApplicationController
  def new
    @company = Company.find(params[:company_id])
    @project = @company.projects.build
    @project.project_users.build.build_user
  end

  def create
    @company = Company.find(params[:company_id])
    @project = @company.projects.build(proj_params)
    if @project.valid?
      @project.save
      render 'show'
    else
      render 'new'
    end
  end

  private
    def proj_params
      params.require(:project).permit(:name, :description, project_users_attributes: [:id, user_attributes:[:fullname]])
    end
  end
end

#Views - new.html.erb

<%= form_for [@company, @project] do |f| %>
  <%= f.label :title %>
  <%= f.text_field :name %>
  <%= f.label :description %>
  <%= f.text_area :description %>
  <%= f.fields_for :project_users do |project_user_form| %>
    <%= project_user_form.fields_for :user do |user| %>
      <%= user.label :team_members %>
      <%= user.select :fullname, company.users.collect { |p| [ p.fullname, p.id ] }, {:prompt => 'Select Team Members'}, { :multiple => true} %>
    <% end %>
  <% end %>
  <%= f.button :submit => "" %>
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5


    【解决方案1】:

    这就是为什么您的强参数不能正常工作的原因。 你在proj_params 中说:fullname 是一个字段。但它不仅仅是一个字段 - 它是一个值数组。因此,如果您将其更改为 :fullname =&gt; [],则将允许该参数。

    但是..这没有任何意义。 您的代码正在尝试创建新用户,而不是分配他们。这就是您收到验证错误的原因。防止这种情况的最简单方法是传递用户 ID,它将尝试更新/建立关联,而不是 create。 然后,您最好从视图中传递用户的 ID。尝试传递user_ids 而不是全名,不要忘记强参数中的user_ids =&gt; []

    【讨论】:

    • 嘿@vladimir,谢谢!我要这样做吗? params.require(:project).permit(:name, :description, project_users_attributes: [:id, user_attributes:[:fullname]]) to params.require(:project).permit(:name , :description, project_users_attributes: [:id, user_attributes:[:user_ids=>[ ]]])
    • @KengHong 是的,就像那样。
    • 感谢您的帮助!但是,当我采纳您的建议时,出现以下错误:- undefined local variable or method `user_ids' for #<0x007fa90f685320>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2023-04-02
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多