Rails 5中未允许的参数

dev*_*033 16 ruby ruby-on-rails ruby-on-rails-5

首先,我想简单地在我发送给我的当前对象中获取一个对象back-end.

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

{
  "name": "Project 1",
  "project_criteria": [
    {
      "name": "Criterium 1",
      "type": "Type 1",
      "benefit": "1"
    },
    {
      "name": "Criterium 2",
      "type": "Type 2",
      "benefit": "3"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我的classes:

class Project < ApplicationRecord
    has_many :project_criteria
    accepts_nested_attributes_for :project_criteria
end

class ProjectCriterium < ApplicationRecord
    belongs_to :project
end
Run Code Online (Sandbox Code Playgroud)

ProjectsController:

def project_params
    params.require(:project).permit(:name,  project_criteria: [] )
end
Run Code Online (Sandbox Code Playgroud)

但我仍然无法访问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 # <-----------
Run Code Online (Sandbox Code Playgroud)

注意:

顺便说一句,我已经试图用严格的标准,而不是标准(其中-在我看来-是正确的,因为它应该使用复数)的has_manyaccepts_nested_attributes_for,但它也不起作用.

有人有解决方案吗?

Mar*_*mic 34

这并不是"标准"这个词给你带来问题的转折(虽然你可以添加一个自定义的变形器来获得你喜欢的单数和复数版本).

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

改变你目前的参数:

params.require(:project).permit(:name,  project_criteria: [] )
Run Code Online (Sandbox Code Playgroud)

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

params.require(:project).permit(:name,  project_criteria: [:name, :type, :benefit] )
Run Code Online (Sandbox Code Playgroud)

您处理多个嵌套对象的事实使您的情况更加复杂,因此您必须传递一个哈希:

params.require(:project).permit(:name,  { project_criteria: [:name, :type, :benefit]} )
Run Code Online (Sandbox Code Playgroud)


Pro*_*ton 5

我在开发 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
Run Code Online (Sandbox Code Playgroud)

个人信息模型

class PersonalInfo < ApplicationRecord
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

用户控制器

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
Run Code Online (Sandbox Code Playgroud)

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

这是我修复它的方法

我只需将 Personal_Info 添加idUsersController参数中即可:

用户控制器

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
Run Code Online (Sandbox Code Playgroud)

另一种方法是以这种方式将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
Run Code Online (Sandbox Code Playgroud)

就这样。

我希望这有帮助