有没有可能的方法可以在一行中编码?如果......<>
<% if @box == 'inbox' && m.is_read?(current_user) %>
A
<% else %>
B
<% end %>
你需要一个三元运算符——在 Ruby 中也称为"条件"运算符,如果 ?
前面的表达式为真,则返回 "A",如果表达式为 false,则返回 "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)
这会将收件箱逻辑隔离到单个位置(例如,不分散在任意数量的视图文件中),如果您需要其他框的其他逻辑(例如,"垃圾箱"或其他内容),则会创建一个焦点。
它还提供了一个提示,即如果存在任意数量的知名盒子(例如,垃圾箱、已发送、今天等),元编程的东西可能对识别盒子很有用。这完全取决于正在发生的事情。
像这样在视图层中分散逻辑使重构变得不那么明显,并在逻辑/输出需要更改时强制多个更改点。