对于#<Array,未定义的方法`with_indifferent_access':

Jor*_*uel 3 ruby ruby-on-rails

我已经尝试了很多方法,但它不起作用.我在这个项目中,另一个具有相同代码的控制器,另一个使用has_many关系的区别,有问题的是has_one和belongs_to.我们去看看代码.

class Endereco < ActiveRecord::Base
 has_one :user
end

class User < ActiveRecord::Base
 belongs_to :endereco
 accepts_nested_attributes_for :endereco
Run Code Online (Sandbox Code Playgroud)

控制器中的强参数:

class Backoffice::UsersController < BackofficeController

def create
 @user = User.new(params_user)
 respond_to do |format|  
  if @user.save!
    format.json { render json: @user, include: :endereco}
  else
    format.json { render json: @user.errors, status: :unprocessable_entity }
  end
 end
end



 def params_user
   params.require(:user).permit(:nome, 
        :email, 
        :password, 
        :password_confirmation, 
        :cpf, 
        :tel_fixo, 
        :tel_cel,
        endereco_attributes: [
          :rua,
          :bairro,
          :cidade,
          :uf,
          :cep,
          :referencia,
          :numero,
          :complemento          
          ])
  end 
Run Code Online (Sandbox Code Playgroud)

当我通过POSTMAN发送这个json时,我得到#Array的错误>未定义方法`with_indifferent_access':在这一行

@user = User.new(params_user)

{   "user":{
    "nome" : "teste1", 
    "email" : "teste@tt.com", 
    "password": "123", 
    "password_confirmation": "123", 
    "cpf": "123321", 
    "tel_fixo": "123321", 
    "tel_cel": "asdsd",
    "endereco_attributes": [
        {
          "rua": "tt",
          "bairro": "tete",
          "cidade": "asdas",
          "uf":"asdasd",
          "cep": "12321",
          "referencia": "asdasd",
          "numero":"123",
          "complemento":"123" }
    ]
}}
Run Code Online (Sandbox Code Playgroud)

有人给我点灯吗?谢谢!

And*_*all 7

endereco_attributes在输入中创建了一个Array,而不是一个对象(然后它变成了Ruby中的Hash).由于它是一个单数(belongs_to)关联,Rails希望它是一个哈希,而不是一个哈希数组.数组没有这个方法with_indifferent_access,但Hash没有.

更改您的输入以匹配正确的结构,一切都应该很好.


Jor*_*uel 6

我的 json 错了……我在 [] 的地方不应该

 "endereco_attributes": [{... }]
Run Code Online (Sandbox Code Playgroud)

正确的

  "endereco_attributes": {... }
Run Code Online (Sandbox Code Playgroud)

谢谢。