有没有可能的方法在一行中编写代码?类似于 <%= "A" if ........>
<% if @box == 'inbox' && m.is_read?(current_user) %>
A
<% else %>
B
<% end %>
有没有可能的方法在一行中编写代码?类似于 <%= "A" if ........>
<% if @box == 'inbox' && m.is_read?(current_user) %>
A
<% else %>
B
<% end %>
您需要一个三元运算符——在 Ruby 中也称为“条件”运算符,如果前面的表达式?
为真,则返回“A”,如果表达式为假,则返回“B”。
<%= (@box == 'inbox' && m.is_read?(current_user)) ? "A" : "B" %>
三元运算符可以解决问题(有关如何使用它,请参阅其他答案),但我强烈建议您不要在这里使用它。使用三元运算符,您将减少代码,但您的可读性会因此受到很大影响。
在视图层中,三元组只会让您头疼;逻辑应该在一个助手中,例如,
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)
这将收件箱逻辑隔离到单个位置(例如,不分散在任意数量的视图文件中),如果您需要其他框的附加逻辑(例如,“垃圾”或其他东西),则创建一个焦点。
它还提供了一个提示,即如果有任何数量的知名盒子(例如,垃圾箱、已发送、今天等),元编程可能有助于识别盒子。这一切都取决于正在发生的事情。
像这样在视图层中分散逻辑会使重构变得不那么明显,并在逻辑/输出需要更改时强制进行多个更改点。