Rails 救援 NoMethodError 替代方案

Rails rescue NoMethodError alternative

我正在创建一个应该在不同环境中 运行 的代码(每个环境的代码略有不同)。相同的 class 可能在一个中定义了一个方法,但在另一个中却没有。这样,我可以使用类似的东西:

rescue NoMethodError

在方法未定义时捕获事件 class,但捕获异常不是正确的逻辑通量。

是否存在替代方法,例如 present 来了解该方法是否在特定的 class 中定义? class 是一项服务,而不是 ActionController

我在想:

class User
  def name
    "my name"
  end
end

然后

User.new.has_method?(name)

或类似的东西。

如下所示:https://ruby-doc.org/core-2.7.0/Object.html#method-i-respond_to-3F它是Object的一个方法。因此它将检查该方法的任何对象并用 truefalse.

回复
class User
  def name
    "my name"
  end
end

User.new.respond_to?(name)

将returntrue

Rails 有一个方法 try 可以尝试使用一个方法,但如果该对象不存在该方法则不会抛出错误。

@user = User.first
#=> <#User...>

@user.try(:name)
#=> "Alex"

@user.try(:nonexistant_method)
#=> nil

您可能也在寻找类似 method_missing 的内容,请查看此 post:https://www.leighhalliday.com/ruby-metaprogramming-method-missing

这可能是 Given a class, see if instance has method (Ruby)

的重复

来自上面的link:你可以使用这个:

User.method_defined?('name')
# => true

正如其他人所建议的,您可能需要查看缺少的方法:

class User
  def name
    "my name"
  end

  def method_missing(method, *args, &block)
    puts "You called method #{method} using argument #{args.join(', ')}"
    puts "--You also using block" if block_given?
  end
end

User.new.last_name('Saverin') { 'foobar' }
# => "You called last_name using argument Saverin"
# => "--You also using block"

如果你不了解ruby元编程,你可以从here

开始