在我的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
这个方法应该返回除true以外的任何值吗?它知道跳到其他部分吗?或者,因为它返回的值不是false,它会在if语句的顶部继续吗?
换句话说,我应该这样做:if create_response_backup == true ... else ... end
https://gist.github.com/jfarmer/2647362给出了Ruby中truthy和falsy值的良好概述。相对于您上面的代码,
return response_backup.errors.full_messages.to_sentence
将导致返回一个非零字符串,该字符串的求值结果为truthy。
如果你有一个If语句:
if create_response_backup
puts "A"
else
puts "B"
end
我希望上面的代码只输出A
(response_backup.errors.full_messages.to_sentence中的某些内容被评估为nil并引发nil值错误的情况除外)
看起来if create_response_backup
总是求值为true,除非response_backup.errors.full_messages.to_sentence
曾经是nil
或false
Ruby在if
条件中将对象求值为true
。您的方法将始终返回一个ResponseBackup
对象或值或response_backup.errors.full_messages.to_sentence
(我假设它是一个String)。
如果你想验证备份是否已创建,你可以进行
if create_response_backup.class == ResponseBackup ... else ... end
根据该方法的更广泛范围,您需要决定是对返回值进行检查更好,还是重构该方法以返回true或false更好。