0

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

假设示例:

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

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

4

2 回答 2

5

您应该避免在视图中使用复杂的条件(和大多数条件)。将它们提取到 Helper,或者更好的是,提取到某种“演示者”,以便您可以使用接收器而不是那些“全局外观/感觉的助手”

一些帮手

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 %>应该使用 a-而不是 a =

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

= work_link %>
= @ethos. try :tagline

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

- unless @ethos.blank?
 - unless @work.nil? do
   = link_to "Add Work", work_path
 = @ethos.tagline
于 2012-07-07T18:04:27.993 回答
1

如果代码有效,您担心什么?是美学还是因为嵌套太多而难以推理代码在做什么?

最简单的解决方案可能只是移动条件内联。

<%= link_to("Add Work", work_path) if @ethos.present? && @work %>
<%= @ethos.tagline if @ethos.present? %>

这将提高可读性(从而提高可维护性),尽管它可能不足以让 Rails 纯粹主义者满意。Zabba 的回答提出了几个很好的选择,可以进一步深入兔子洞。

于 2012-07-07T19:28:11.260 回答