0

他のライブラリの redis ラッパーである gem を実装しようとしています。つまり、ruby オブジェクトを redis に保存しようとしています。

すべてうまくいきますが、私が望むのは私がしたときです

[Class].all このようなオブジェクトを提供します

[#<Peagon:0x007fba589de3a0 @name="a", @omg=false ,@payload="one",@handler="--- one\n...\n"> ,#<Peagon:0x007fba589de1a0 @name="b", @omg=true,@payload="two",@handler="--- two\n...\n">]

代わりに、アクティブなレコードがオブジェクトをどのように提示するかのように見せたい

[#<Peagon name: "a",omg: false ,handler: "--- one\n...\n"> ,#<Peagon name="b", omg: true,handler: "--- two\n...\n">]

この理由は、ユーザーに@payloadインスタンス変数を表示することに興味がないためです。これは、他のライブラリによって設定されたものであるためです

基本的にこのようなことが起こります [私の宝石]

class Peagon
 include SomeModule
 attr_accessor :name,:omg,:handler 
 def initialize(options)
   @name = options[:name]
   @omg  = options
   self.payload_object = options[:payload_object]
 end

end 

[その他のライブラリ]にはこれが含まmoduleれています。

module SomeModule 
 def payload=(object)
   @payload ||= object
   self.handler = @payload.to_yaml

 end 

 def payload
   @payload ||= YAML.load(self.handler)
 end

終わり

ノート :

他のライブラリからペイロードメソッドを上書きすることは考えていません

今、私が上で意味したことを得ることが可能ですか

4

1 に答える 1

1

irbクラスのオブジェクトについて、Rails コンソール、およびフレンドが表示するものを調整したいだけのようです。もしそうなら、彼らはただ呼び出すinspect

検査→文字列

人間が判読できるobjの表現を含む文字列を返します。デフォルトでは、クラス名とインスタンス変数とその値のリストを表示します (それぞれに対してinspectを呼び出します)。ユーザー定義クラスは、このメソッドをオーバーライドして、objをより適切に表現する必要があります。

inspectしたがって、次のような独自の実装を提供するだけです。

def inspect
  "#<#{class} name: #{@name.inspect} ...>"
end
于 2013-08-14T17:02:54.797 に答える