0

メソッドがレールに存在しない場合、何かを返そうとしています。

私が持っているルビーモデルは次のようになります:

class myModel

  attr_accessible :attr_a, :attr_b, #name of attributes `attr_c` and `attr_d`
                  :attr_c, :attr_d  #are equal to `method_c` and `method_d` names
  #init some values
  after_initialize :default_values

  def default_values
    self.is_active ||= true
    self.attr_a ||= 'None'
    self.attr_b ||= 1
    if !self.respond_to?("method_c")
      #return something if the method is called
      self.method_c = 'None' #not working
    end
    if !self.respond_to?("method_d")
      #return something if the method is called
      self.method_d = 'None' #not working
    end
  end

  #more methods
end

ただし、仕様テストでエラーが発生します。

   NoMethodError:
     undefined method `method_c' for #<Object:0xbb9e53c>

クレイジーに聞こえるかもしれませんが、メソッドが存在しない場合に何かを返すにはどうすればよいですか?

4

1 に答える 1

2

Ruby には#method_missingという優れた構造があり、そのメソッドを処理しないオブジェクトにメッセージが送信されるたびに呼び出されます。これを使用して、メソッド名でメソッドを動的に処理できます。

class MyModel

  attr_accessible :attr_a, :attr_b, #name of attributes `attr_c` and `attr_d`
                  :attr_c, :attr_d  #are equal to `method_c` and `method_d` names
  #init some values
  after_initialize :default_values

  def default_values
    self.is_active ||= true
    self.attr_a    ||= 'None'
    self.attr_b    ||= 1
  end

  def method_missing(method, *args)
    case method
    when :method_c
      attr_c = "None"   # Assigns to attr_c and returns "None"
    when :method_d
      attr_d = "None"   # Assigns to attr_d and returns "None"
    else
      super             # If it wasn't handled, then just pass it on, which will result in an exception.
    end
  end
end
于 2013-09-06T17:39:58.243 に答える