さまざまな入力用の多数の attr_accessor フィールドを含むデータ オブジェクトがあります。すべてのフィールドのすべてのセッターが、たとえば、試行された nil の代わりに空の文字列として値を設定するように、何らかの方法でクラスを定義できますか?
質問する
168 次
2 に答える
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
最初に attr_reader を通常どおり定義します。
attr_reader attr
次に、アクセサーと同じ名前のメソッドを定義してライターを定義しますが、末尾に「=」のみを使用します。したがって、 attribute:bar
の場合、メソッドには名前が付けられますbar=
define_method "#{attr}=" do |value|
...
end
次に、変数を設定する必要があります。まず、nil を空の文字列に変換します。
value = '' if value.nil?
次に、インスタンス変数が実行時までわからないインスタンス変数の割り当てを行う instance_variable_set を使用します。
instance_variable_set "@#{attr}", value
クラス Foo は nil_to_blank_attr_accessor がインスタンス メソッドではなくクラス メソッドである必要があるため、extend
代わりにinclude
次のものを使用します。
class Foo
extend NilToBlankAttrAccessor
...
end
于 2013-03-16T16:26:13.303 に答える
1
する代わりに
object.foo = given_input
やったほうがいい
object.foo = given_input.nil? ? "" : given_input
false
または、あなたも変わりたい場合は""
、
object.foo = given_input || ""
于 2013-03-16T16:25:43.187 に答える