高度条件的Rails 3视图

Pat*_* A. 0 conditional ruby-on-rails

我有一个Rails 3应用程序,我使用了很多条件语句来改变页面的设计.为了拥有如此大量的条件,保持逻辑不在视图中的最佳做法是什么?

假设示例:

<% unless @ethos.blank? %>
 <%= unless @work.nil? do %>
  <%= link_to "Add Work", work_path %>
 <% end %>   
 <%= @ethos.tagline %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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

Zab*_*bba 5

您应该避免视图中的复杂条件(和大多数条件).将它们提取给帮助者,或者更好的是,将其提取给某种"演示者",以便您可以使用接收器而不是那些"全球寻找/感受帮助者"

SomeHelper

module SomeHelper
  def work_link
    (@ethos.present? && @work) ? link_to("Add Work", work_path) : nil
  end
end
Run Code Online (Sandbox Code Playgroud)

视图

<%= work_link %>
<%= @ethos.tagline if @ethos.present? %>
Run Code Online (Sandbox Code Playgroud)

如果@ethos可能与nil[]数组相反,您可以使用:

<%= @ethos.try :tagline  %>
Run Code Online (Sandbox Code Playgroud)

另请注意,在原始视图中<%= unless @work.nil? do %>应该使用a -而不是a =.

哦,我鼓励你使用HAML而不是ERB.使用HAML,视图看起来像这样(更容易阅读,不是吗):

= work_link %>
= @ethos. try :tagline
Run Code Online (Sandbox Code Playgroud)

您的原始视图在HAML中看起来像这样(请记住,尽可能避免视图中的条件!)

- unless @ethos.blank?
 - unless @work.nil? do
   = link_to "Add Work", work_path
 = @ethos.tagline
Run Code Online (Sandbox Code Playgroud)