rails 4在初始化器中使用应用程序助手

时间:2014-04-12 20:47:13

标签: ruby-on-rails ruby gem initialization

是否可以在config/initializers/browser_blocker.rb内包含/使用Application Helper方法?

我正在使用browser gem来检测和阻止较旧的非现代浏览器。

Rails.configuration.middleware.use Browser::Middleware do
    include ApplicationHelper
    redirect_to :controller => 'error', :action => 'browser-upgrade-required' if browser_is_not_supported
end

我目前正在使用的助手方法:

  # test browser version
  def browser_is_not_supported
    return true unless browser.modern?
    return true if browser.chrome? && browser.version.to_i < ENV['BROWSER_BASE_VERSION_GOOGLE'].to_i
    return true if browser.firefox? && browser.version.to_i < ENV['BROWSER_BASE_VERSION_FIREFOX'].to_i
    return true if browser.safari? && browser.version.to_i < ENV['BROWSER_BASE_VERSION_SAFARI'].to_i
    return true if browser.opera? && browser.version.to_i < ENV['BROWSER_BASE_VERSION_OPERA'].to_i
    return true if browser.ie? && browser.version.to_i < ENV['BROWSER_BASE_VERSION_MSFT'].to_i
  end

2 个答案:

答案 0 :(得分:6)

这是一种方法:

# lib/browser_util.rb
module BrowserUtil
  def self.supported?(browser)
    # your code ...
  end
end

并从ApplicationHelper中包装它以在视图中使用

module ApplicationHelper
  def is_browser_supported?
    BrowserUtil.supported?(browser)
  end
end

在中间件

Rails.configuration.middleware.use Browser::Middleware do
  unless BrowserUtil.supported?(browser)
    redirect_to :controller => 'error', :action => 'browser-upgrade-required' 
  end
end

更新:它不需要位于单独的模块中(BrowserUtil)

module ApplicationHelper
  def self.foo
    "FOO"
  end

  def foo
    ApplicationHelper.foo
  end
end

在中间件中使用

ApplicationHelper.foo

在视图中它将使用包含的方法

foo

答案 1 :(得分:0)

当然你可以,但这是个坏主意,我同意那个逻辑应该在app的某个地方,但有时你必须处理它。我这样说是因为您可以在old_browser请求获取并加载rails stack之前阻止请求。

无论如何,这是你怎么做的

Rails.configuration.middleware.use Browser::Middleware do
  self.class.send(:include,ApplicationHelper)
   redirect_to :controller => 'error', :action => 'browser-upgrade-required' unless    browser_is_supported?
end