5

さまざまな入力用の多数の attr_accessor フィールドを含むデータ オブジェクトがあります。すべてのフィールドのすべてのセッターが、たとえば、試行された nil の代わりに空の文字列として値を設定するように、何らかの方法でクラスを定義できますか?

4

2 に答える 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 に答える