我正在创建一个使用omniauth gem的用户(正在运行),但在创建user
之后,我也想在profile
表中创建一条记录(但仅限于创建了user
。
我决定在user
模型中使用回调来执行此操作。
但是,在执行回调并且它达到我的create_profile
方法后,我遇到有关user
模型中的方法的错误:
undefined method `facebook' for #<Hash:0x007fdf16858200>
即使我将用户:self传递给配置文件模型,我也无法访问它。
User.rb
class User < ActiveRecord::Base
has_one :profile
has_many :pins
has_many :replies, through: :pins
after_create :build_profile
def self.from_omniauth(auth)
where(auth.slice(:provider, :provider_id)).first_or_initialize.tap do |user|
user.provider = auth.provider
user.provider_id = auth.uid
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save
end
end
def build_profile
Profile.create_profile(user: self)
end
def facebook
@facebook ||= Koala::Facebook::API.new(oauth_token)
end
end
Profile.rb
class Profile < ActiveRecord::Base
belongs_to :user
def self.create_profile(user)
# undefined method `facebook' for #<Hash:0x007fdf16858200> for this line.
user.facebook.inspect
end
end
我是Ruby和Rails的新手......所以,请耐心等待!
我很感激你看着这个并告诉我哪里出错了。
谢谢, 迈克尔。
PS - 似乎user.inspect
在我的profile.rb
模型中返回用户的结果...但我试图访问该用户类的方法。
答案 0 :(得分:3)
如果哈希self
user: self
def build_profile
Profile.create_profile(self)
end
此外,build_<has_one_association>
由rails提供。
你可以做到
user.build_profile #this will return a profile object with user_id set
如果要构建关联对象,而不是执行
profile = Profile.new(:user_id => user.id)
你可以做到
profile = user.build_profile
以上内容将自动初始化配置文件对象并设置user_id
。
在您的情况下,您将覆盖rails提供的build_profile
方法