2012-04-23 82 views
1

我用我的Rails應用程序設計omniauth,這裏是User類Rails的設計omniauth:無法跟上Facebook的數據在用戶會話

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable 

    attr_accessible :email, :password, :password_confirmation, :remember_me, :encrypted_password, :fb_id 

    def set_facebook_info(info) 
    @facebook_info = info 
    end 

    def get_facebook_info 
    @facebook_info 
    end 

    def self.find_for_facebook_oauth(access_token, signed_in_resource=nil) 
    data = access_token.extra.raw_info 
    if user = User.find_by_email(data.email) 
     if not user.fb_id 
     user.fb_id = access_token.uid 
     user.save 
     end 
     user.set_facebook_info "whatever" <-- I tried here 

     user 
    else # Create a user with a stub password. 
     user = User.create(:email => data.email, :password => Devise.friendly_token[0,20], :fb_id => access_token.uid) 
     user 
    end 
    end 

    def self.new_with_session(params, session) 
    super.tap do |user| 
      user.set_facebook_info "whatever" # <-- I Tried here too 
     if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["user_hash"] 
     user.email = data["email"] 
     end 
    end 
    end 
end 

我想用set和get方法保持一些Facebook的用戶信息。但是當我在視圖中使用current_user時,它不會給我在User類中設置的值。 像application.html.erb:

<span><%= current_user.get_facebook_info %></span> 

返回空值

有誰有一個關於它的想法?這應該是一個常見的情況。一般來說,我們如何通過設計將一些未連接到DB屬性的數據分配給current_user?

感謝

回答

1

你@facebook_info屬性只存儲在內存中,而不是保存到數據庫。因此,在下一頁加載時,Devise會再次從數據庫加載模型,這就是信息丟失的原因。

如果你想保留Facebook的信息,你需要將它保存到數據庫。 Rails有直接在文本列存儲哈希的一些很好的方法:

class User < ActiveRecord::Base 
    serialize :preferences 
end 

user = User.create(:preferences => { "background" => "black", "display" => large }) 
User.find(user.id).preferences # => { "background" => "black", "display" => large } 

來源:http://api.rubyonrails.org/classes/ActiveRecord/Base.html

相關問題