has_one 嵌套属性的允许参数未应用
Permit params for has_one nested attributes does not applied
型号class:
class User < ActiveRecord::Base
has_one :data, inverse_of: :user
accepts_nested_attributes_for :data
end
已发布正文
{data: {active: false}, data_attributes: {active: false}, nickname: "nick"}
Rails日志
Parameters: {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "id"=>"1", "user"=>{"nickname"=>"nick"}}
参数:
<ActionController::Parameters {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "controller"=>"api/users", "action"=>"update", "id"=>"1", "user"=>{"nickname"=>"nick"}} permitted: false>
params.require(:user).permit(:昵称, data_attributes: [:active])
<ActionController::Parameters {"nickname"=>"nick"} permitted: true>
User.new(一)
#<User id: nil, provider: "email", uid: "", name: nil, nickname: "nick", image: nil, email: nil, created_at: nil, updated_at: nil>
User.new(a).data
nil
怎么了。这是正确的行为吗?
正确创建嵌套数据对象需要修复什么?
数据哈希应该是这样的:
{用户:{active:false},data_attributes:{active:false},昵称:"nick"}
问题是你的散列是:
Parameters: {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "id"=>"1", "user"=>{"nickname"=>"nick"}}
应该是:
Parameters: {"user"=>{"nickname"=>"nick", "id"=>"1","data_attributes"=>{"active"=>false}}
我不认为嵌套模型的参数在默认情况下是包装的。您可能必须自己将它们包装在 "user" 键下,或者告诉您的控制器它应该显式包装哪些参数。
第一个选项应由您的表单处理(如果您正在执行 AJAX 请求,则应由 JS 库处理)。
第二个选项类似于
class UsersController < ApplicationController
wrap_parameters :user, include: [:data_attributes]
def create
# now you can access params[:user][:data_attributes]
end
end
有关详细信息,请参阅 ActionController::ParamsWrapper and this Rails issue 上的文档。
型号class:
class User < ActiveRecord::Base
has_one :data, inverse_of: :user
accepts_nested_attributes_for :data
end
已发布正文
{data: {active: false}, data_attributes: {active: false}, nickname: "nick"}
Rails日志
Parameters: {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "id"=>"1", "user"=>{"nickname"=>"nick"}}
参数:
<ActionController::Parameters {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "controller"=>"api/users", "action"=>"update", "id"=>"1", "user"=>{"nickname"=>"nick"}} permitted: false>
params.require(:user).permit(:昵称, data_attributes: [:active])
<ActionController::Parameters {"nickname"=>"nick"} permitted: true>
User.new(一)
#<User id: nil, provider: "email", uid: "", name: nil, nickname: "nick", image: nil, email: nil, created_at: nil, updated_at: nil>
User.new(a).data
nil
怎么了。这是正确的行为吗? 正确创建嵌套数据对象需要修复什么?
数据哈希应该是这样的:
{用户:{active:false},data_attributes:{active:false},昵称:"nick"}
问题是你的散列是:
Parameters: {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "id"=>"1", "user"=>{"nickname"=>"nick"}}
应该是:
Parameters: {"user"=>{"nickname"=>"nick", "id"=>"1","data_attributes"=>{"active"=>false}}
我不认为嵌套模型的参数在默认情况下是包装的。您可能必须自己将它们包装在 "user" 键下,或者告诉您的控制器它应该显式包装哪些参数。
第一个选项应由您的表单处理(如果您正在执行 AJAX 请求,则应由 JS 库处理)。
第二个选项类似于
class UsersController < ApplicationController
wrap_parameters :user, include: [:data_attributes]
def create
# now you can access params[:user][:data_attributes]
end
end
有关详细信息,请参阅 ActionController::ParamsWrapper and this Rails issue 上的文档。