Rails:Rails 5 中不允许的参数

Posted

技术标签:

【中文标题】Rails:Rails 5 中不允许的参数【英文标题】:Rails: Unpermitted parameter in Rails 5 【发布时间】:2016-12-27 01:22:01 【问题描述】:

首先,我只想在当前对象中获取一个对象,然后将其发送到我的后端

我有这个简单的JSON(从表单生成):


  "name": "Project 1",
  "project_criteria": [
    
      "name": "Criterium 1",
      "type": "Type 1",
      "benefit": "1"
    ,
    
      "name": "Criterium 2",
      "type": "Type 2",
      "benefit": "3"
    
  ]

我的classes

class Project < ApplicationRecord
  has_many :project_criteria
  accepts_nested_attributes_for :project_criteria
end

class ProjectCriterium < ApplicationRecord
  belongs_to :project
end

ProjectsController:

def project_params
  params.require(:project).permit(:name,  project_criteria: [] )
end

但我仍然无法访问project_criteria 参数,如下所示:

Started POST "/projects" for 127.0.0.1 at 2016-08-19 16:24:03 -0300
Processing by ProjectsController#create as html
  Parameters: "project"=>"name"=>"Project 1", "project_criteria"=>"0"=>"benefit"=>"1", "name"=>"Criterium 1", "type"=>"Type 1", "1"=>"benefit"=>"3", "name"=>"Criterium 2", "type"=>"Type 2"
Unpermitted parameter: project_criteria # <-----------

注意:

顺便说一句,我已经尝试使用 criterium 而不是 criterium(我认为 - 是正确的,因为它应该复数)在has_manyaccepts_nested_attributes_for,但它也不起作用。

有人对此有解决方案吗?

【问题讨论】:

小注:标准的单数是criterion 可能是一个关于自行车比赛的应用¯_(ツ)_/¯ 【参考方案1】:

我在使用 Rails 6 应用程序时遇到了这个问题。

我的应用程序包含一个 User 模型,该模型与 Personal_Info 模型具有一对一的关系

我原来的代码是这样的:

用户模型

class User < ApplicationRecord 
  has_one :personal_info, class_name: 'PersonalInfo', dependent: :destroy
  accepts_nested_attributes_for :personal_info, allow_destroy: true
end

个人信息模型

class PersonalInfo < ApplicationRecord
  belongs_to :user
end

用户控制器

class UsersController < ApplicationController

  def index
    @users = User.all
  end
  .
  .

  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation,
                                 personal_info_attributes: [:first_name,  
                                 :last_name, :phone, :gender, :dob, 
                                 :address, :city, :state, :country])
  end
end

问题是我没有将 Personal_Info id 添加到接受的用户参数(参数)中。

这是我修复它的方法

我只需以这种方式将 Personal_Info id 添加到 UsersController 参数中:

用户控制器

class UsersController < ApplicationController

  def index
    @users = User.all
  end
  .
  .

  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation,
                                 personal_info_attributes: [:id, :first_name,  
                                 :last_name, :phone, :gender, :dob, 
                                 :address, :city, :state, :country])
  end
end

另一种方法是将update_only 选项添加到用户模型中:

class User < ApplicationRecord 
  has_one :personal_info, class_name: 'PersonalInfo', dependent: :destroy
  accepts_nested_attributes_for :personal_info, update_only: true, allow_destroy: true
end

就是这样。

我希望这会有所帮助

【讨论】:

【参考方案2】:

给您带来问题的不是“标准”一词的变形(尽管您可以添加自定义变形器来获得您喜欢的单数和复数版本,如果您真的想要的话)。

问题是您必须明确允许嵌套对象的字段。

更改您当前的参数:

params.require(:project).permit(:name,  project_criteria: [] )

对此(对于单个嵌套对象):

params.require(:project).permit(:name,  project_criteria: [:name, :type, :benefit] )

您的情况有些复杂,因为您正在处理多个嵌套对象,因此您必须改为传递哈希:

params.require(:project).permit(:name,   project_criteria: [:name, :type, :benefit] )

【讨论】:

感谢您的回复,但使用您建议的两种方式都会给出:ActiveRecord::AssociationTypeMismatch (ProjectCriterium(#39449900) expected, got Array(#17940440)): 我猜你将 JSON 作为哈希传递?这听起来可能很愚蠢,但是......如果你想要一个最后的数组,请传递一个哈希(我的例子)。如果你想在最后一个哈希,传递一个数组(这似乎是你想要的),所以只需用方括号替换花括号并试一试。 嗯,我是通过我在问题的最初部分发布的那种方式,但它是以hash ("project_criteria"=&gt;"0"=&gt;"benefit"=&gt;"1", "name"=&gt;"Criterium 1", "type"=&gt;"Type 1", "1"=&gt;"benefit"=&gt;"3", "name"=&gt;"Criterium 2", "type"=&gt;"Type 2") 的形式出现的。顺便说一句,我想要一个数组最后..但不幸的是,你的两个建议都给了我这个错误。 您是否尝试结合我们的答案?重命名属性以及显式列出嵌套属性?该错误基本上是说 Rails 需要一个 ProjectCriterium 的实例,但它得到了一个数组,所以我猜测数据传递后会出现错误。我将修改create 方法,将save! 替换为save,以查看在尝试保存嵌套对象时是否生成更详细的异常。 @developer033 上面的评论非常真实。您也必须使用 :id 键将属性名称保留在 [] 中。你不能保持空白。

以上是关于Rails:Rails 5 中不允许的参数的主要内容,如果未能解决你的问题,请参考以下文章

rails - 设计强参数总是不允许注册

Rails 强参数 - 允许在数组中进行深度嵌套哈希

通过Rails中的关联使用has_many创建新模型时出现不允许的参数错误

Rails:参数太少

Rails:使用参数重定向

Rails 5:无法从参数中检索哈希值