`||`(`或`)子句带有`if`语句

时间:2013-01-18 06:34:34

标签: ruby-on-rails ruby

这不是评估if声明吗?

<%= current_user.profile.name || current_user.email if current_user.profile.name.blank? %>

current_user.profile.name上的调试显示它是一个空字符串,但它不打印email。改成这样的三元运算符:

<%= current_user.profile.name.blank? ? current_user.email : current_user.profile.name %>

有效,但我想了解为什么第一种方法不起作用。

4 个答案:

答案 0 :(得分:2)

在Ruby中,只有nilfalse才算错。空字符串不是假的,因此它满足条件,并且不评估||和after。

另一方面,blank?返回true表示空字符串。这就是两个例子之间的区别。

答案 1 :(得分:1)

正如其他人已经指出的那样,Ruby中的空字符串是真的,这就解释了为什么需要额外的blank?。也就是说,请注意active_support渴望缓解痛苦,Object#presence

<%= current_user.profile.name.presence || current_user.email %>

答案 2 :(得分:0)

current_user.profile.name上的调试是一个空字符串 表示以下条件

if current_user.profile.name.blank? == false

这意味着

代码

current_user.profile.name || current_user.email

将不会被执行,因此结果

答案 3 :(得分:-2)

以下一行:

<%= current_user.profile.name || current_user.email if current_user.profile.name.blank? %>

口译员检查第1部分:

<%=  current_user.profile.name || 

第2部分:

current_user.email if current_user.profile.name.blank? %>

然后OR语句陷入困境,并给出错误。第二个参数(current_user.email if current_user.profile.name.blank?)是否可用...

根据我的理解......希望你明白。