跨控制器保持对象

时间:2012-11-04 09:08:15

标签: ruby-on-rails ruby heroku

我正在使用Rails中的heroku api,并遇到了一个潜在的问题。

提交登录表单后,我将实例化heroku对象。

heroku = Heroku::API.new(:username => USERNAME, :password => PASSWORD)

然后我想在所有控制器中使用heroku对象来进一步查询api。我试过@heroku,@@ heroku和$ heroku,但都没有用。这可能吗?

我发现使用api获取用户api密钥的唯一解决方案,将其存储在会话中,然后使用它在每个控制器方法中重新实例化heroku对象。这是最好/唯一的解决方案吗?

1 个答案:

答案 0 :(得分:1)

通常,before_filter可以解决您的重新实例化问题。如果要设置可用于每个控制器方法的实例变量,请执行以下操作:

class UsersController < ApplicationController

  before_filter :get_user

  def profile
    # @user is accessible here
  end

  def account
    # @user is accessible here
  end

  private 

  def get_user
    @user = User.find(params[:id])
  end

end

您还可以在应用程序控制器中使用 before_filters来设置所有控制器均可访问的实例变量。 Read about filters here

至于将API密钥存储到会话中,这是有效的,但如果您想要长期访问,则可能需要将API密钥写入数据库。与之前的过滤器结合使用,您可以执行以下操作:

class ApplicationController < ActionController::Base

  before_filter :setup_heroku

  def setup_heroku
    if current_user && current_user.heroku_api_key
      @heroku = Heroku::API.new(:api_key => current_user.heroku_api_key)
    end
  end

end