Adr*_*ien 21 ruby if-statement ruby-on-rails nomethoderror grape-api
这是我的代码:
class Order < Grape::Entity
expose :id { |order, options| order.id.obfuscate }
expose :time_left_to_review do |order, options|
byebug
order&.time_left_to_review # ERROR
end
expose :created_at { |order, options| order.last_transition.created_at }
end
# NoMethodError Exception: undefined method `time_left_to_review' for #<Order:0x007f83b9efc970>
Run Code Online (Sandbox Code Playgroud)
我认为这&.是一个捷径,.try但我想我错了.可能有人指出我正确的方向,我错过了什么?
我觉得这不是红宝石相关的.葡萄可能吗?虽然我不明白它是怎么回事.
tad*_*man 12
这种try方法忽略了很多东西,它只是给它一个镜头,并且如果事情没有成功就把它称为一天.
在&有条件的导航选项将只阻塞调用nil对象.其他任何内容都被视为有效,并将继续产生全部后果,包括例外情况.
小智 7
除了上面的答案之外,我还添加了一些例子。1
account = Account.new(owner: Object.new)
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
account.try!(:owner).try!(:address)
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,try不检查接收者是否响应给定的方法。而try!和 的&.行为相同。如果接收者响应该address方法,则所有接收者都将返回相同的结果。我更喜欢使用,&.因为它看起来更干净。
有关安全导航操作员 (&.) 的更多信息,我发现此博客非常有用https://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/
我来晚了一点,其他答案已经涵盖了它的工作原理,但是我想补充一些其他答案未涉及的内容。
你的问题问的有什么区别try,并&.在红宝石。Ruby是这里的关键词。
最大的区别是tryRuby中不存在,它是Rails提供的一种方法。如果您在rails控制台中执行以下操作,则可以看到此信息,也可以自己查看:
[1, 2, 3].try(:join, '-')
#=> "1-2-3"
Run Code Online (Sandbox Code Playgroud)
但是,如果您在irb控制台中执行相同的操作,则会得到:
[1, 2, 3].try(:join, '-')
NoMethodError: undefined method `try' for [1, 2, 3]:Array
Run Code Online (Sandbox Code Playgroud)
它&.是Ruby标准库的一部分,因此可以在任何Ruby项目中使用,而不仅仅是Rails。
| 归档时间: |
|
| 查看次数: |
10422 次 |
| 最近记录: |