以为我脑死了。当X存在时(哈希中指定键的值),我需要一种非常简洁的写法,打印该值(即X),否则,打印0.它需要简洁的原因是因为我正在使用它在options
中为form_tag
,我想避免写一个方法。
想不通过......这就是我尝试过的:
<%= number_field_tag "transaction[][#{thing}]", :quantity, min: 0, placeholder: 0 || @transactionparams["#{thing}"] %>
@transactionparams
不存在,而不是得到0,我得到一个错误未定义的方法[]' for nil:NilClass
`三元运算符怎么样?
@transactionparams = {:thing => "foo"}
puts @transactionparams ? @transactionparams[:thing] : 0
@transactionparams = nil
puts @transactionparams ? @transactionparams[:thing] : 0
如果你正在使用Ruby 2+,你可以利用nil.to_h
是一个空哈希的事实:
v = @transactionparams.to_h[:thing] || 0
你也可以利用nil.to_i
为零:
v = @transactionparams.to_h[:thing].to_i
请注意,Rails会修补NilClass#to_h
以返回一个空Hash,这样即使你不在Ruby 2+中也能正常工作。
这些假设你并不期望nil
成为Hash中的值。如果你想允许nil
值,那么使用带有第二个参数的fetch
:
v = @transactionparams.to_h.fetch(:thing, 0)
因为你在Rails中,所以你可以将try
放入混合中以吞下实例变量的nil
值:
v = @transactionparams.try(:fetch, :thing, 0).to_i
跟随to_i
跟注是因为nil.try(m)
是所有nil
的m
。您也可以明确地调用#[]
并避免第二次“返回此而不是引发异常”参数Hash#fetch
:
v = @transactionparams.try(:[], :thing).to_i
你可以混合和匹配上面的内容,具体取决于你期望在@transactionparams
中有哪些值,以及你需要如何具体处理nil
s。在大多数情况下,我可能会选择to_h
和to_i
:
@transactionparams.to_h[:thing].to_i
我倾向于使用.to_X
方法(特别是#to_a
)来隐藏nil
检查,所以我会立即认识到to_h
和to_i
在该表达式中的用途。