2013-02-22 5 views
6

모든 클래스에서 로거를 사용하고 있습니다.레일없이 ruby ​​before_filter에서 레일을 구현하십시오.

class FOO 

def initialize 
end 

def bar 
    msg_prefix = "#{self.class}::#{__method__}" 
    ... some code ... 
    @logeer = "#{msg_prefix} msg ..." 
end 

def bar2 
    msg_prefix = "#{self.class}::#{__method__}" 
    ... some code 2 ... 
    @logeer = "#{msg_prefix} msg2 ..." 
end 

end 

내가 방지하기 위해 레일에 같은 before_filter를 사용하려면이 내가 지금 뭘하는지입니다

Class_name::Method_name 

: 나는 각 MSG가과 같이 클래스 이름 및 메소드 이름으로 시작하려면 이중성, 나는 sinatra을 사용하고 있지만 수업은 오래된 것임 ruby 1.9.3 클래스

아이디어 ??

(아마도 귀하의 경우는 하나 개의 라인을 실행하기위한 잔인한하지만) 당신은 일반 루비 클래스에 before_filter -like 동작을 취득 ActiveModel::Callbacks을 사용할 수 있습니다
+0

sinatra와 함께 activerecord를 사용할 수 있습니다. https://github.com/janko-m/sinatra-activerecord – AJcodez

답변

5

당신은 어떤 방법에 콜백을받을 수 있습니다 Module#method_added을 사용하여 이전 메서드의 별칭을 지정한 다음 before_filter 메서드를 먼저 호출하는 새 메서드를 정의합니다. 당신이 메서드 이름을 통과해야, 그래서 당신은 필터 방식이 아닌 원래의 메소드의 이름을 얻을 것이다, 당신이 create_prefix에 있던 같은 __method__를 사용하여

module Filter 
    def before_filter name 
    @@filter = name 
    end 

    def method_added name 
    return if @filtering # Don't add filters to original_ methods 
    return if @@filter == name # Don't filter filters 
    return if name == :initialize 

    @filtering = true 

    alias_method :"original_#{name}", name 
    define_method name do |*args| 
     self.send @@filter, name 
     self.send :"original_#{name}", *args 
    end 
    @filtering = false 
    end 
end 

class FilterTest 
    extend Filter 
    before_filter :prepare_logs 

    def baz 
    puts "#{@msg_prefix} message goes here" 
    end 

    def prepare_logs name 
    @msg_prefix = "#{self.class}::#{name}" 
    end 
end 

ft = FilterTest.new 
ft.baz 

: 여기 내 (매우) 거친 최초의 개념이다 조금 더 깨끗하게 만들 수있는 다른 솔루션이있을 수 있습니다.

+0

감사합니다 zaius,이 참으로 속임수를했지만 슈퍼 클래스에서 구현 한 및 1. 그것은 슈퍼 클래스 자체에 대한, 2. 그것은 자식, 3입니다. 그것은 손자에 대한, 그것은 내게 '잡히지 않은 예외 : stack level too deep' 나는 왜 그런지 궁금합니다. – WebQube

+0

글쎄 .. 그것은 일종의 해킹 솔루션입니다. 그래서 저를 놀라게하지 않습니다. 귀하의 코드와 오류 메시지를 요점이나 다른 것에 붙여 넣으십시오. 왜 그것이 고장 났는지 말할 수 있습니다. – zaius

+0

여기 있습니다. 인스턴스는 끝에 있습니다. [요점] (https://gist.github.com/ohadpartuck/5070783) – WebQube

1

: 생성되는

require 'active_model' 

class FOO 
    extend ActiveModel::Callbacks 

    define_model_callbacks :baz, only: :before 

    before_baz :create_prefix 

    def initialize 
    end 

    def bar 
    run_callbacks :baz do 
     ... some code ... 
     @logeer = "#{@msg_prefix} msg ..." 
    end 
    end 

    def bar2 
    run_callbacks :baz do 
     ... some code 2 ... 
     @logeer = "#{@msg_prefix} msg2 ..." 
    end 
    end 

    private 

    def create_prefix 
     @msg_prefix = "#{self.class}::#{__method__}" 
    end 
end 
+0

안녕하세요, 답변을 주셔서 감사합니다. 그러나 레일을 사용하는 정확한 방법으로 사용하는 방법을 찾고 있습니다. 'before_filter : do_prefix_msg'가 각 함수 앞에 자동으로 실행되도록합니다. (다르게 알려지지 않았다면) – WebQube

+0

'ActiveModel :: Callbacks '를 사용하면 상당한 양의 코드를 다시 구현하지 않고도 원하는 효과를 얻는 가장 쉬운 방법이라고 생각합니다 그게 레일스의 콜백 뒤에 있습니다. (https://github.com/rails/rails/blob/v3.2.12/actionpack/lib/abstract_controller/callbacks.rb). 나는 이전에 내 자신의 프로젝트 중 하나를 가지고 같은 문제를 가지고 있었고,'ActiveModel :: Callbacks'보다 더 좋은 해결책을 찾지 못했습니다. 그러나 다른 누군가가 알고있는 다른 방법이 있기를 희망하면서, 나는 그 질문을 +1 할 것이다. –