【问题标题】:rails 4 use application helpers inside initializersrails 4 在初始化程序中使用应用程序助手
【发布时间】:2014-04-12 20:47:13
【问题描述】:

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

【问题讨论】:

  • 为什么需要ApplicationHelper 功能?最好只使用特定的模块,很难举个例子,因为你的例子没有使用任何帮助方法
  • 因为我希望在应用程序的其他部分使用 browser_is_not_supported?这可能吗?

标签: ruby-on-rails ruby gem initialization


【解决方案1】:

这是一种方法:

# 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

【讨论】:

  • 根据您的建议,我更喜欢这个想法,但现在我得到“ApplicationHelper:Module 的未定义局部变量或方法‘浏览器’”
  • 啊,我忘了发送(浏览器),我想我现在有这个,正在测试atm
  • 已修复!谢谢!我喜欢你关于覆盖方法的观点。那可能是危险的,谢谢你的帮助。
【解决方案2】:

当然可以,但这是个坏主意,我同意该逻辑应该在 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

【讨论】:

  • 就像@Paritosh 说的那样-“但那是个坏主意”:为了清楚起见,您正在将 ApplicationHelper 中的所有方法混合到此类中:github.com/fnando/browser/blob/master/lib/browser/middleware.rb ,所以如果您要添加任何方法使用与 ApplicationHelper 相同的名称,您的新方法将覆盖浏览器版本 - 这些类型的缺陷在发生时很难追踪
  • 那么,您愿意在 2 个地方复制该方法吗?如果您认为从长远来看会更好,我不反对将其切换到您的版本@house9。
  • 它并不是真正重复的,而是通过类方法或实例方法“可调用” - 我个人会走这条路,而不是在这种特定情况下使用include
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多