Rails: Rails 中不允许的参数 5
Rails: Unpermitted parameter in Rails 5
首先,我只想在发送到 后端 的当前对象中获取一个对象。
我有这个简单的 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
项目控制器:
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 而不是 criteria(我认为 - 是正确的,因为它应该是复数)在 has_many
和 accepts_nested_attributes_for
中,但它也不起作用。
有人对此有解决方案吗?
给您带来问题的不是单词 "criteria" 的变形(尽管您可以添加自定义变形器来获得您喜欢的单数和复数版本,如果您确实需要的话)。
问题是您必须明确允许嵌套对象的字段。
更改您当前的参数:
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]} )
我在处理 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 添加到接受的用户参数(parameters)中。
这是我修复它的方法:
我只需要通过这种方式将 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
选项添加到 Users 模型:
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
就这些了。
希望对您有所帮助
首先,我只想在发送到 后端 的当前对象中获取一个对象。
我有这个简单的 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
项目控制器:
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 而不是 criteria(我认为 - 是正确的,因为它应该是复数)在 has_many
和 accepts_nested_attributes_for
中,但它也不起作用。
有人对此有解决方案吗?
给您带来问题的不是单词 "criteria" 的变形(尽管您可以添加自定义变形器来获得您喜欢的单数和复数版本,如果您确实需要的话)。
问题是您必须明确允许嵌套对象的字段。
更改您当前的参数:
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]} )
我在处理 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 添加到接受的用户参数(parameters)中。
这是我修复它的方法:
我只需要通过这种方式将 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
选项添加到 Users 模型:
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
就这些了。
希望对您有所帮助