Rails - 如何访问父模型中的类?

时间:2014-02-25 21:03:18

标签: ruby-on-rails ruby ruby-on-rails-4 gem

我正在创建一个使用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模型中返回用户的结果...但我试图访问该用户类的方法。

1 个答案:

答案 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方法