是否可以在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
答案 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