我有一个Rails 3应用程序,我使用了很多条件语句来改变页面的设计。对于拥有如此大量条件的逻辑而言,将逻辑排除在视图之外的最佳做法是什么?
假设示例:
<% unless @ethos.blank? %>
<%= unless @work.nil? do %>
<%= link_to "Add Work", work_path %>
<% end %>
<%= @ethos.tagline %>
<% end %>
我在其他条件中有更多的条件。在一个视图中管理这个的最佳方法是什么?
答案 0 :(得分:5)
您应该避免在视图中使用复杂的条件(和大多数条件)。将它们提取给助手,或者更好的是,将其提取给某种“演示者”,以便您可以使用接收器而不是那些“全局观察/感觉帮助者”
SomeHelper
module SomeHelper
def work_link
(@ethos.present? && @work) ? link_to("Add Work", work_path) : nil
end
end
查看
<%= work_link %>
<%= @ethos.tagline if @ethos.present? %>
如果@ethos
可能是nil
而不是空的[]
数组,则可以使用:
<%= @ethos.try :tagline %>
另请注意,在原始视图<%= unless @work.nil? do %>
应该使用-
而不是=
。
哦,我鼓励你使用HAML而不是ERB。使用HAML,视图看起来像这样(更容易阅读,不是吗):
= work_link %>
= @ethos. try :tagline
您的原始视图在HAML中看起来像这样(请记住,尽可能避免视图中的条件!)
- unless @ethos.blank?
- unless @work.nil? do
= link_to "Add Work", work_path
= @ethos.tagline
答案 1 :(得分:1)
如果代码有效,您关注的是什么?它是美学还是你难以推断出代码在做什么,因为嵌套太多了?。
最简单的解决方案可能只是内联条件。
<%= link_to("Add Work", work_path) if @ethos.present? && @work %>
<%= @ethos.tagline if @ethos.present? %>
这将提高可读性(因此可维护性),尽管它可能不足以让Rails纯粹主义者感到高兴。 Zabba的答案提出了几个很好的选择,进一步深入兔子洞。