高度条件的Rails 3视图

时间:2012-07-07 17:59:17

标签: ruby-on-rails conditional

我有一个Rails 3应用程序,我使用了很多条件语句来改变页面的设计。对于拥有如此大量条件的逻辑而言,将逻辑排除在视图之外的最佳做法是什么?

假设示例:

<% unless @ethos.blank? %>
 <%= unless @work.nil? do %>
  <%= link_to "Add Work", work_path %>
 <% end %>   
 <%= @ethos.tagline %>
<% end %>

我在其他条件中有更多的条件。在一个视图中管理这个的最佳方法是什么?

2 个答案:

答案 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的答案提出了几个很好的选择,进一步深入兔子洞。