2012-07-13 2 views
1

플러그인을 만들고 있는데 모델에 대한 setter/getter를 재정의해야합니다. 지금까지 가지고있는 코드는 다음과 같습니다.레일 3 모델 설정 도구를 재정의

module Iplong 
    extend ActiveSupport::Concern 

    module ClassMethods 
     ... 

     def override_setter 
      self.class_eval %(
       def #{attribute}=(raw_value) 
        self[:#{attribute}] = #{ip2long('raw_value')} 
       end 
      ) 
     end 
    end 

end 

ActiveRecord::Base.send :include, Iplong 

raw_value 매개 변수에 유의하십시오. 내가 평가 된 코드에서 인쇄하면 속성이 설정되었을 때 올바른 값을 인쇄하지만 문자가 함수 내에서 인쇄되면 문자열이 반환됩니다. raw_value 그래서 해석하지 않고이 매개 변수를 전달하려면 어떻게해야합니까? 문자열로?

"#{ip2long('raw_value')}" 

루비 코드를 문자열에서이 번역 당신이 얻을 것 : 그래서

ip2long('raw_value') 

실제로 'RAW_VALUE을 보내는

답변

0

귀하의 문제는 코드의 특정 부분에 '문자열 대신 해당 변수의 실제 값을 사용합니다.

함께 코드를 바꿉니다 :

"#{ip2long(raw_value)}" 

그리고 당신은 괜찮을 것이다.

편집 :이 샘플 코드는 작동 줄 방법을 보여줍니다하지만 정의되지 않은 지역 변수 또는 번호 '방법'RAW_VALUE`얻을

class A 
    attr_accessor :ip 

    def ip2num(ip) 
    ip.gsub(".", "") 
    end 

    def override(attr) 
    code = "def #{attr}=(value); @ip = ip2num(value); end" 
    self.class.class_eval(code) 
    end 
end 

a = A.new 
a.ip = "0.0.0.0" 
puts a.ip 

a.override("ip") 
a.ip = "0.0.0.0" 
puts a.ip 
+0

그 시도 <클래스 : 0x00000003bc72a0>'확실하지 –

+0

을 prob. 수도 있지만 당신이 내가 무슨 뜻인지 볼 수 있도록 몇 가지 샘플 코드를 포함하는 대답을 편집. –