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 上的文档。