有没有办法在一行中对此进行编码?类似于<%=""如果.......>
<% if @box == 'inbox' && m.is_read?(current_user) %>
A
<% else %>
B
<% end %>
答案 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)
这会将收件箱逻辑隔离到单个位置(例如,不会分散在任意数量的视图文件中),如果您需要其他框的其他逻辑(例如,“垃圾”或其他内容),则会创建一个焦点。
它还提供了一个提示,即如果有任何众所周知的盒子(例如,垃圾,发送,今天等),元编程可能对识别盒子有用。这完全取决于发生了什么。
在视图层中像这样散射逻辑会使重构变得不那么明显,并在逻辑/输出需要改变时强制多个变化点。