1

プラグインを作成していますが、モデルのセッター/ゲッターをオーバーライドするためにプラグインが必要です。これが私がこれまでに持っているコードです:

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パラメータに注意してください。evaluedコードで出力すると、属性が設定されたときに正しい値が出力されますが、送信先のip2long関数内で出力すると文字列が返されます。raw_valueしたがって、文字列として解釈されずにこのパラメーターを渡すにはどうすればよいですか。 ?

4

1 に答える 1

0

あなたの問題は、この特定のコードにあります:

"#{ip2long('raw_value')}"

これを文字列から Ruby コードに変換すると、次のようになります。

ip2long('raw_value')

したがって、実際には、その変数の実際の値ではなく、「raw_value」文字列を送信しています。

コードを次のように置き換えます。

"#{ip2long(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
于 2012-07-13T17:23:36.017 に答える