2013-03-16 10 views
5

私はさまざまな入力に対して数十のattr_accessorフィールドを含むデータオブジェクトを持っています。どういうわけかクラスを定義して、すべてのフィールドのすべての設定が試行されたnilではなく空の文字列として値を設定しますか?書き込み時にnilを文字列に変換するattr_accessor

+1

あなたは「未遂nilを」何を意味するのですか? – Linuxios

+0

誰かがobject.foo = nilを試みた場合、実際には変数fooはnilではなく ""に設定されます。 –

答えて

9

ここで行うにはほとんどのモジュールがありますそれ:

module NilToBlankAttrAccessor 

    def nil_to_blank_attr_accessor(attr) 
    attr_reader attr 
    define_method "#{attr}=" do |value| 
     value = '' if value.nil? 
     instance_variable_set "@#{attr}", value 
    end 
    end 

end 

だけでそれを混ぜる:

class Foo 
    extend NilToBlankAttrAccessor 
    nil_to_blank_attr_accessor :bar 
end 

そして、それを使用します。

foo = Foo.new 
foo.bar = nil 
p foo.bar  # => "" 
foo.bar = 'abc' 
p foo.bar  # => "abc" 
それは

NilToBlankAttrAccessor#nil_to_blank_attr_accessor仕組み

は、第1常attr_readerを定義しています

attr_reader attr 

次に、アクセッサと同じ名前のメソッドを定義し、最後に "="だけを使用してライターを定義します。だから、属性:barのために、方法は、今では、変数を設定する必要があるbar=

define_method "#{attr}=" do |value| 
     ... 
    end 

命名されます。

 value = '' if value.nil? 

そして、インスタンス変数は実行時まで知られていないインスタンス変数への代入を行うinstance_variable_setを使用します。まず、それが空の文字列にはnilになります。

 instance_variable_set "@#{attr}", value 

Fooクラスは、クラスメソッドではなく、インスタンスメソッドであることをnil_to_blank_attr_accessorを必要とするので、代わりにincludeextendを使用しています。

class Foo 
    extend NilToBlankAttrAccessor 
    ... 
end 
+1

それは 'nil'だけでなく' false'を '' ''に変更します。 – sawa

+0

@sawa、ありがとう。一定。 –

+0

@WayneConradそれは素敵な答えと素晴らしい説明です:) –

1

代わりの

object.foo = given_input 

をやってあなたは

object.foo = given_input.nil? ? "" : given_input 

またはあなたにも""falseをオンにする場合に行う必要があり、その後、

object.foo = given_input || "" 
関連する問題