1

有没有可能的方法在一行中编写代码?类似于 <%= "A" if ........>

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

3 回答 3

5

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

<%= (@box == 'inbox' && m.is_read?(current_user)) ? "A" : "B" %>
于 2013-01-27T15:18:34.553 回答
2

三元运算符可以解决问题(有关如何使用它,请参阅其他答案),但我强烈建议您不要在这里使用它。使用三元运算符,您将减少代码,但您的可读性会因此受到很大影响。

于 2013-01-27T15:20:23.853 回答
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)

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

它还提供了一个提示,即如果有任何数量的知名盒子(例如,垃圾箱、已发送、今天等),元编程可能有助于识别盒子。这一切都取决于正在发生的事情。

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

于 2013-01-27T19:38:10.057 回答