如何在一行内编写这个`if语句`?

时间:2013-01-27 15:16:01

标签: ruby-on-rails ruby-on-rails-3

有没有办法在一行中对此进行编码?类似于<%=""如果.......>

<% if @box == 'inbox' && m.is_read?(current_user) %>
A
<% else %>
B
<% end %> 

3 个答案:

答案 0 :(得分:5)

你需要一个三元运算符 - 在Ruby中也称为“条件”运算符,如果?之前的表达式为真,则返回“A”,如果表达式为假,则返回“B”。

<%= (@box == 'inbox' && m.is_read?(current_user)) ? "A" : "B" %>

答案 1 :(得分:2)

三元运算符可以解决问题(请参阅其他答案以了解如何使用它),但我建议您强烈反对在此处使用它。使用三元操作符可以减少代码,但是你的可读性会受到很大影响。

答案 2 :(得分:0)

在视图层中,三元素只能让你感到头痛;逻辑应该在帮手中,例如,

def inbox_msg_read?(box, msg)
  box == 'inbox' && msg.is_read?(current_user)
end

<%= inbox_msg_read?(@box, msg) ? 'A' : 'B' %>

根据实际发生的情况,我可能会将“A”/“B”部分移动到帮手中。

我将“收件箱”逻辑移动到辅助方法或邮箱对象中:

box.inbox? && msg.is_read?(current_user)

这会将收件箱逻辑隔离到单个位置(例如,不会分散在任意数量的视图文件中),如果您需要其他框的其他逻辑(例如,“垃圾”或其他内容),则会创建一个焦点。

它还提供了一个提示,即如果有任何众所周知的盒子(例如,垃圾,发送,今天等),元编程可能对识别盒子有用。这完全取决于发生了什么。

在视图层中像这样散射逻辑会使重构变得不那么明显,并在逻辑/输出需要改变时强制多个变化点。