hol*_*den 10 ruby ruby-on-rails ruby-on-rails-4
我正在尝试避免从可能有或没有值的哈希中提取错误消息.我想要它返回值或返回nil.
我认为该try
方法会这样做,但我仍然会收到错误.
key not found: "en"
Run Code Online (Sandbox Code Playgroud)
我的哈希是一个名为content
... content['en']
等的hstore列.
content = {"es"=>"This is an amazing event!!!!!", "pl"=>"Gonna be crap!"}
Run Code Online (Sandbox Code Playgroud)
试试方法
@object.content.try(:fetch, 'en') # should return nil, but errors even with try method
Run Code Online (Sandbox Code Playgroud)
我认为这会奏效,但事实并非如此.我怎样才能返回nil
而不是错误?
此外,内容字段本身也可能是nil
如此调用content['en']
throws:
undefined method `content' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
mu *_*ort 22
如果您需要允许object.content.nil?
,那么您可以使用try
.如果你想允许丢失密钥然后你不想要fetch
(正如Priti所说),你想要正常的[]
方法.结合两种产量:
object.content.try(:[], 'en')
Run Code Online (Sandbox Code Playgroud)
注意:
> h = { :a => :b }
=> {:a=>:b}
> h.try(:[], :a)
=> :b
> h.try(:[], :c)
=> nil
> h = nil
=> nil
> h.try(:[], :a)
=> nil
Run Code Online (Sandbox Code Playgroud)
object.content.try(:fetch, 'en', nil)
如果:[]
它看起来像是在嘲笑你,你也可以使用它.
请参阅Hash #fetch
返回给定键的哈希值.如果找不到密钥,则有几个选项:如果没有其他参数,则会引发KeyError异常 ; 如果给出了默认值,那么将返回; 如果指定了可选代码块,那么将运行该代码块并返回其结果.
h = { "a" => 100, "b" => 200 }
h.fetch("z")
# ~> -:17:in `fetch': key not found: "z" (KeyError)
Run Code Online (Sandbox Code Playgroud)
所以使用:
h = { "a" => 100, "b" => 200 }
h.fetch("z",nil)
# => nil
h.fetch("a",nil)
# => 100
Run Code Online (Sandbox Code Playgroud)