我在gem中定义了一个模型(Google :: APIClient.new),我在我的控制器中创建了一个gem的实例。
我想在每个用户的控制器操作之间共享实例,所以我需要以某种方式持久化它。我已经尝试将它存储在会话变量(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]
答案 0 :(得分: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
答案 1 :(得分: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实例绑定到特定用户,请创建FooWrapper :belongs_to :user
。当您实例化真实的gem实例时,您可以根据需要使用任何特定于用户的信息。