2014-04-12 3 views
1

config/initializers/browser_blocker.rb 안에 Application Helper 메서드를 포함하거나 사용할 수 있습니까?레일 4 초기화 도구 내부에서 응용 프로그램 도우미 사용

이전 비 현대 브라우저를 감지하고 차단하기 위해 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

을 할 수있는 방법인가? 예를 들어, 응용 프로그램의 다른 부분에서 browser_is_not_supported를 사용하고 싶었 기 때문에 예제에서 도우미 메서드 – house9

+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 

in midd 뷰 미들웨어 사용

ApplicationHelper.foo 

에 별도의 모듈 일 필요는 없다 (BrowserUtil)

module ApplicationHelper 
    def self.foo 
    "FOO" 
    end 

    def foo 
    ApplicationHelper.foo 
    end 
end 

가 포함 된 방법을 사용하는 것이다 :

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

UPDATE leware

foo 
+0

나는이 아이디어를 당신의 권고에 기반 해 조금 더 좋아하지만 지금은 ApplicationHelper에 대해 "정의되지 않은 지역 변수 또는 메소드'브라우저 '를 얻고있다 : Module" –

+0

아, 나는 (브라우저)를 보내지 않았다. 테스트 atm –

+0

고정! 감사! 방법 우선 적용에 대한 귀하의 의견이 마음에 들었습니다. 그게 위험 할 수도 있었어, 네 도움에 고마워. –

0

물론 좋겠지 만 나쁜 생각 일 수 있습니다. 그 논리가 app에있는 어딘가에 있어야한다고 동의하지만 가끔 처리해야합니다. 내가 이것을 말하고 있는데, old_browser 요청이 도착하기 전에 요청을 차단하고 rails stack을로드하기 때문입니다.

어쨌든, 이것은 당신이 그것을 왜이`ApplicationHelper` 기능을 필요합니까

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 
+0

@Paritosh가 말했듯이 - "하지만 그건 나쁜 생각입니다."여러분의 ApplicationHelper에있는 모든 메소드를이 클래스에 혼합하고 있다는 것을 분명히하기 위해서 : https://github.com/fnando/browser/blob/master/lib/browser /middleware.rb이므로 ApplicationHelper에 같은 이름의 메소드를 추가하면 새 메소드가 브라우저 버전을 덮어 씁니다 - 이러한 유형의 결함은 발생시 추적하기가 매우 어렵습니다. – house9

+0

그래서 복제를 위해 2 곳의 방법? 나는 당신의 버전 @ house9로 전환하는 것에 반대하지 않는다. 장기적으로 더 나아질 것이라고 생각한다면. –

+0

그것은 실제로 복제되지 않지만 클래스 메소드 나 인스턴스 메소드를 통해 '호출 가능'합니다 - 개인적으로이 특별한 경우에'include'를 사용하는 대신 그 경로로갑니다 – house9

관련 문제