1

Rails アプリケーションで devise omniauth を使用しています。これが User クラスです。

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

Facebook のユーザー情報を保持するために set メソッドと get メソッドを使用したいと考えています。しかし、ビューで current_user を使用すると、 User クラスで設定した値が得られません。application.html.erb のように:

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

空の値を返します

誰かがそれについて考えを持っていますか? これはよくあるケースのはずです。一般に、DB に接続されていない属性を devise 経由で current_user に割り当てるにはどうすればよいでしょうか?

ありがとう

4

1 に答える 1

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

于 2012-05-30T02:26:20.637 に答える