在我的rails项目中,我在模块中定义了以下方法:
def self.create_response_backup
response_backup = ResponseBackup.new(location_name: site.site_name, response_data: response_json)
if !response_backup
return response_backup.errors.full_messages.to_sentence
end
return response_backup
end
我的问题是:
如果我这样做,if create_response_backup ... else ... end
这个方法应该返回任何真实的东西 - 它会知道跳到其他部分吗?或者,因为它返回的值不是false,它会继续在if语句的顶部吗?
换句话说,我应该这样做:if create_response_backup == true ... else ... end
答案 0 :(得分:5)
https://gist.github.com/jfarmer/2647362很好地概述了Ruby中的truthy和falsy值。相对于上面的代码,
return response_backup.errors.full_messages.to_sentence
会导致返回一个非零字符串,而后者又会评估为真实。
如果您有if语句:
if create_response_backup
puts "A"
else
puts "B"
end
我希望你的代码只能输出A
(除非在response_backup.errors.full_messages.to_sentence中的某些内容被评估为nil且引发了nil值错误)
答案 1 :(得分:1)
看起来if create_response_backup
将始终评估为true,除非response_backup.errors.full_messages.to_sentence
始终为nil
或false
Ruby在true
条件下将对象评估为if
。您的方法将始终返回ResponseBackup
对象或值response_backup.errors.full_messages.to_sentence
(我假设它是一个字符串)。
如果要验证备份是否已创建,则可以执行
if create_response_backup.class == ResponseBackup ... else ... end
根据此方法的更广泛范围,您需要决定是否更好地对返回值使用检查或重构该方法以返回true或false。