1

我在 gem (Google::APIClient.new) 中定义了一个模型,并且在我的控制器中创建了该 gem 的实例。

我想在每个用户的控制器操作之间共享实例,所以我需要以某种方式持久化它。我尝试将其存储在会话变量 (session[:client] = Google::APIClient.new) 和我自己的模型 (User.goog_client = Google::APIClient.new) 的一个字段中,但这不起作用. 是否有一种正确的方法可以为每个用户从另一个 gem 中保存一个模型?

提前致谢!

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

例如,您可以在控制器中添加过滤器

 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 回答
1

听起来您可能想为这些继承自 ActiveRecord::Base 的对象创建一个包装类。

包装器对象上的属性将是通过 gem 实例化对象所需的任何信息。然后,您将创建(或覆盖)一个这样做的 finder 方法。

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 实例绑定到特定用户,那么 make FooWrapper :belongs_to :user. 当您实例化真正的 gem 实例时,您可以根据需要使用任何特定于用户的信息。

于 2012-11-24T09:17:46.070 回答