Rails:帮助程序中的控制器方法或实例变量

时间:2011-09-25 01:32:44

标签: ruby-on-rails helpers

我正在使用bitly gem并希望能够访问我的帮助器方法中的有点API(由视图和邮件程序调用以生成URL)。

我在ApplicationController中使用此方法启动API连接:

(是否有更合适的地方做BTW?)

class ApplicationController < ActionController::Base
  before_filter :bitly_connect

  def bitly_connect
    Bitly.use_api_version_3
    @bitly ||= Bitly.new(APP_CONFIG['bitly_username'], APP_CONFIG['bitly_api_key'] )
  end
end

默认情况下,我无法访问助手中的@bitly。你能建议一种方法来实现这个目标吗?

我找到的唯一相关主题没有帮助: Rails 3 and Controller Instance Variables Inside a Helper

感谢。

2 个答案:

答案 0 :(得分:9)

按照惯例,Rails将控制器操作(和过滤器)中设置的实例变量传递给视图。辅助方法在这些视图中可用,并且应该可以访问您在控制器操作中设置的实例变量。

或者,您可以通过将变量传递给方法或使用Object#instance_variable_get方法在助手方法中设置局部变量:http://ruby-doc.org/core/classes/Object.html#M001028

# app/controllers/example_controller.rb
class ExampleController
  def index
    @instance_variable = 'foo'
  end
end

# app/helpers/example_helper.rb
module ExampleHelper
  def foo
    # instance variables set in the controller actions can be accessed here
    @instance_variable # => 'foo'
    # alternately using instance_variable_get
    variable = instance_variable_get(:@instance_variable)
    variable # => 'foo'
  end
end

至于您对逻辑位置的关注,它看起来并不属于控制器。将控制器视为应用程序的路由请求。大多数逻辑应该在模型类中执行。 “瘦的控制器,胖模型。”:http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

答案 1 :(得分:2)

如果您需要一个控制器方法可以作为帮助程序访问,您可以使用helper_method

class ApplicationController < ActionController::Base
  helper_method :bitly_connect

  def bitly_connect
    @bitly ||= begin
      Bitly.use_api_version_3
      Bitly.new(APP_CONFIG['bitly_username'], APP_CONFIG['bitly_api_key'] )
    end
  end
end

请注意,我也更改了方法,因此每次调用时都不会调用Bitly.use_api_version_3

正如Ben Simpson所说,你应该把它变成一个模型。