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

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

我正在使用浏览器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 

这是一种方法:

 # 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 

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

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

 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