Rails在ActiveRecord模型上有一个结合"respond_to?"的实例方法吗?并且寄出"?

zyk*_*lic 1 ruby activerecord ruby-on-rails

我做了一些谷歌搜索但无济于事.

我的场景是我有一个辅助方法,它采用一些选项,然后在页面上通过部分渲染一个常用的图形元素,由发送的选项调整.这些选项中的大多数具有由助手设置的不同的可覆盖默认值,基于前两个必需参数 - 对象上下文.

def my_helper(object, context, options = {})
    defaults = { ... }
    defaults[:foo] = "bar" if object.is_a?(SomeObject)
    defaults[:ping] = "pong" if context.eql?(:some_context)
    ...
    render partial: '/path/to/partial', locals: defaults.merge(options)
end
Run Code Online (Sandbox Code Playgroud)

虽然上下文都很好看,但是我已经决定放弃查看对象类,并且在合理的情况下使用respond_to?它.我想要避免的是多个if object.respond_to?(:foo?) && object.foo?,只是使用类似的东西if object.respond_to_and_send(:foo?),如果对象无法响应方法,则返回nil.


更新
我忘了提到这是一个Rails 3.2应用程序,这是一个耻辱try,因为在Holger Just的答案中提到的Rails 4中的更新方法正是我需要的.

Hol*_*ust 5

你可以try像这样使用:

object.try(:foo?)
Run Code Online (Sandbox Code Playgroud)

它将检查是否object响应foo?,如果是,则调用该方法.如果object没有响应方法,try将返回nil.

有关详细信息,请参阅文档

  • @DNNX:Rails 4中的实现发生了变化.在早期版本中,它总是调用`__send__`并覆盖`NilClass`,它只返回`nil`.从Rails4开始,它实际上使用`respond_to?`. (2认同)