Rails:ActiveSupport的未定义方法`primary_key':: HashWithIndifferentAccess:Class

时间:2013-06-24 14:32:23

标签: ruby-on-rails

我的用户模型有多态关系。我正在使用Devise。

当我尝试编辑用户的详细信息时,出现以下错误:

undefined method `primary_key' for ActiveSupport::HashWithIndifferentAccess:Class

通过表单提交的数据是:

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"Ap0JP2bs/w9J6iI9rZahiKR1K8UEIi7rp33a4OutMbo=",
 "user"=>{"email"=>"some_email@yahoo.com",
 "rolable"=>{"first_name"=>"Cristian",
 "last_name"=>"Gavrila",
 "city"=>"16"}},
 "commit"=>"Update"}

控制器方法是:

  def update
    @user = User.find(current_user.id)

    if @user.update_attributes(params[:user])
      redirect_to edit_user_registration_path, notice: 'Your profile was successfully updated.'
    else
      redirect_to edit_user_registration_path, error: "Something went wrong, couldn't update your profile!."
    end
  end

模特:

1。用户

class User < ActiveRecord::Base
  belongs_to :rolable, :polymorphic => true

  # Devise business
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :remote_avatar_url, :avatar, :login, :username, :email, :password, :password_confirmation, :remember_me

  # For authenticating with facebook
  attr_accessible :provider, :uid, :rolable
  devise :omniauthable, :omniauth_providers => [:facebook]

  # For authenticating with both username or email
  attr_accessor :login

  # Upload avatar
  mount_uploader :avatar, AvatarUploader

  # Makes username necessary
  validates :username, :presence => true
end

2。客户

class Customer < ActiveRecord::Base
  has_one :user, :as => :rolable
  has_one :preferences, :class_name => "CustomerPreferences"
  belongs_to :city

  attr_accessible :first_name, :last_name
end

有什么问题?

1 个答案:

答案 0 :(得分:3)

根据您的请求哈希,您将rolable属性传递为:

"rolable"=>{"first_name"=>"Cristian",
           "last_name"=>"Gavrila",
           "city"=>"16"}

除非您指定User模型接受rolable的嵌套属性,否则无法执行此操作。但是,您已将User设置为属于Rolable,而不是相反。嵌套属性不是为处理这种反向关系而设计的 - 你可能想重新考虑你在这里要完成的事情,并相应地修改关系。

例如,您可能希望将哈希内部转出,并传递rolable属性,其中嵌入了user属性。或者您可能希望将rolable变为has_one关联。