如何坚持宝石模型实例?

时间:2012-11-24 08:51:26

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-plugins

我在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]

2 个答案:

答案 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实例时,您可以根据需要使用任何特定于用户的信息。