Ruby on rails 为方法参数指定允许的值

Ruby on rails 为方法参数指定允许的值,ruby-on-rails,ruby,Ruby On Rails,Ruby,就像在标题中一样-例如,我有一个方法DrawMewhat,我想允许在参数等于以下值之一时运行此方法:{house,garden,cat,dog}-如果不是,则应停止此方法并打印错误。有什么想法吗 class Draw ALLOWED = %w[house garden cat dog] def self.me(what) raise ArgumentError, "Unknown drawable '#{what}'" unless ALLOWED.include?(what)

就像在标题中一样-例如,我有一个方法DrawMewhat,我想允许在参数等于以下值之一时运行此方法:{house,garden,cat,dog}-如果不是,则应停止此方法并打印错误。有什么想法吗

class Draw
  ALLOWED = %w[house garden cat dog]
  def self.me(what)
    raise ArgumentError, "Unknown drawable '#{what}'" unless ALLOWED.include?(what)
    # Otherwise, carry on!
    puts "I'm going to draw a #{what}!"
  end
end

Draw.me('garden') #=> I'm going to draw a garden!
Draw.me('cat'   ) #=> I'm going to draw a cat!
Draw.me('morals') #=> RuntimeError: Unknown drawable 'morals'
但是,请注意,在大多数情况下,您不应该确保开发人员将正确类型的值传递到您的方法中。如果由于误用而导致某些东西爆炸,您的方法将引发自身错误;尝试检查和捕获这样的错误是浪费您的时间和计算机的时间

编辑:如果您需要经常使用此功能,可以在任何地方使用monkeypatch:

class Object
  def ensure_in( enumerable )
    unless enumerable.include?( self )
      raise ArgumentError, "#{self} must be one of #{enumerable}"
    end
  end
end

def me(what)
  what.ensure_in( ALLOWED )
  # Go ahead
end
但是,请注意,在大多数情况下,您不应该确保开发人员将正确类型的值传递到您的方法中。如果由于误用而导致某些东西爆炸,您的方法将引发自身错误;尝试检查和捕获这样的错误是浪费您的时间和计算机的时间

编辑:如果您需要经常使用此功能,可以在任何地方使用monkeypatch:

class Object
  def ensure_in( enumerable )
    unless enumerable.include?( self )
      raise ArgumentError, "#{self} must be one of #{enumerable}"
    end
  end
end

def me(what)
  what.ensure_in( ALLOWED )
  # Go ahead
end

谢谢我曾想过这样的事情,但还有其他更简单/更短的吗?如何在ruby/rails中进行这样的思考?编辑:也谢谢你的建议,但我目前正在开发我的第一个ruby gem,我真的很想在其中加入这个功能;短于提高“…”的东西,除非是FOO.include?bar?像什么?那怎么可能短得多呢?你必须告诉它失败,你必须告诉它什么值是合法的,你必须告诉它是否要检查什么值。如果您愿意的话,您可以省略这个好消息。我只是想,也许这个只使用指定值的特性run方法是在ruby/rails中的某个内置方法中实现的,我不知道,再次感谢您;好吧,如果你下定决心要经常这样做,你可以想出一个办法。请参阅我的编辑。或者您可以添加Enumerableensure_includes,或者您可以添加Kernelensure_existsobject,enumerable。引发ArgumentError可能比RuntimeError更好。检查参数而不是把它留给下一个环节可以使调试更加容易;我敢肯定,您已经花了一些时间对Rails堆栈跟踪感到困惑,试图找出哪里出了问题。如果界面更严格一点,您会马上知道的。谢谢!我曾想过这样的事情,但还有其他更简单/更短的吗?如何在ruby/rails中进行这样的思考?编辑:也谢谢你的建议,但我目前正在开发我的第一个ruby gem,我真的很想在其中加入这个功能;短于提高“…”的东西,除非是FOO.include?bar?像什么?那怎么可能短得多呢?你必须告诉它失败,你必须告诉它什么值是合法的,你必须告诉它是否要检查什么值。如果您愿意的话,您可以省略这个好消息。我只是想,也许这个只使用指定值的特性run方法是在ruby/rails中的某个内置方法中实现的,我不知道,再次感谢您;好吧,如果你下定决心要经常这样做,你可以想出一个办法。请参阅我的编辑。或者您可以添加Enumerableensure_includes,或者您可以添加Kernelensure_existsobject,enumerable。引发ArgumentError可能比RuntimeError更好。检查参数而不是把它留给下一个环节可以使调试更加容易;我确信你花了一段时间来摸索一堆铁轨堆栈的痕迹,试图找出什么地方出了问题,一点点界面的严格性会马上告诉你。考虑使用符号,而不是考虑使用符号,而不是字符串。