1

私は宝石 (Google::APIClient.new) で定義されたモデルを持っており、コントローラーでその宝石のインスタンスを作成しました。

各ユーザーごとにコントローラーアクション全体でインスタンスを共有したいので、何らかの方法で永続化する必要があります。セッション変数 (session[:client] = Google::APIClient.new) と自分のモデル (User.goog_client = Google::APIClient.new) のフィールドに保存しようとしましたが、うまくいきませんでした. 各ユーザーごとに別の宝石からモデルを永続化する適切な方法はありますか?

前もって感謝します!

Soln: より単純な Soln を見つけ、属性をセッションに保存してからモデルに再読み込みします。

    session[:access_token] = client.authorization.access_token
    session[:refresh_token] = client.authorization.refresh_token
    session[:expires_in] = client.authorization.expires_in
    session[:issued_at] = client.authorization.issued_at

    client.authorization.access_token = session[:access_token] 
    client.authorization.refresh_token = session[:refresh_token]
    client.authorization.expires_in = session[:expires_in]
    client.authorization.issued_at = session[:issued_at]
4

2 に答える 2

1

ActiveRecord::Baseから継承するこれらのオブジェクトのラッパークラスを作成したいようです。

ラッパーオブジェクトの属性は、gemを介してオブジェクトをインスタンス化するために必要な情報になります。次に、そうするファインダーメソッドを作成(またはオーバーライド)します。

class FooWrapper < ActiveRecord::Base

  attr_accessible :x, :y, :z

  def self.get_real_foo(wrapper_id)
    wrapper_obj = self.find(wrapper_id)
    return FooGem.new(wrapper_obj.x, wrapper_obj.y, wrapper_obj.z)
  end
end

あなたはあなたがセッションとあなたのモデルにオブジェクトを保存しようとしたと言いますか?どのくらい正確にそれについて行きましたか?これはあなたの問題を解決するための最良の方法ではないかもしれません...あなたがより多くの詳細を投稿するならば、私たちはあなたが正しい道を進むのをよりよく助けることができるでしょう。

追加の編集:

gemインスタンスを特定のユーザーに関連付けたい場合は、を作成しFooWrapper :belongs_to :userます。実際のgemインスタンスをインスタンス化するときは、必要に応じてユーザー固有の情報を使用します。

于 2012-11-24T09:17:46.070 に答える
1

たとえば、コントローラーにフィルターを追加できます

 class YourController < ApplicationConroller
   before_filter :get_instance

   def action1
     #you can use @instance here
   end

   def action2
     #you can use @instance here
   end

   private: # Hide from outside
     def get_instance
       @instance = CreateYourGemInstanceHere
     end
 end
于 2012-11-24T08:54:55.580 に答える