Search code examples
ruby-on-railsactiverecordnested-attributes

Permit params for has_one nested attributes does not applied


Model class:

class User < ActiveRecord::Base
  has_one :data, inverse_of: :user
  accepts_nested_attributes_for :data
end

Posted body

{data: {active: false}, data_attributes: {active: false}, nickname: "nick"}

Rails Log

Parameters: {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "id"=>"1", "user"=>{"nickname"=>"nick"}}

params:

<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(:nickname, data_attributes: [:active])

<ActionController::Parameters {"nickname"=>"nick"} permitted: true>

User.new(a)

#<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

What's wrong. Is it right beahaviour? What need to fix to nested data object properly create?


Solution

  • Data hash should be like this:

    {user: {active: false}, data_attributes: {active: false}, nickname: "nick"}

    Problem is that your hash is:

    Parameters: {"data"=>{"active"=>false}, "data_attributes"=>{"active"=>false}, "nickname"=>"nick", "id"=>"1", "user"=>{"nickname"=>"nick"}}
    

    It should be:

    Parameters: {"user"=>{"nickname"=>"nick", "id"=>"1","data_attributes"=>{"active"=>false}}