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的一个方法。因此它将检查该方法的任何对象并用 true
或 false
.
回复
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
开始
我正在创建一个应该在不同环境中 运行 的代码(每个环境的代码略有不同)。相同的 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的一个方法。因此它将检查该方法的任何对象并用 true
或 false
.
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
开始