1

我的观点变得越来越复杂,我想知道我应该这样做吗?图片(或代码)值得 1000 字,所以这是视图......

    <% @orientation_by_date[date].each do |orientation| %>
      <% if current_user %>
        <% if orientation.active? %>
          <li><%= link_to orientation.class_time, new_orientation_registration_path(orientation) %>
              (<%= orientation.current_number_seats %>/<%= orientation.seats %>)</li>
        <% else %>
          <li><%= orientation.class_time %>(Class full)</li>
        <% end %>
        <%= link_to "VIEW", orientation_registrations_path(orientation) %></li>
      <% else %>
        <% if orientation.active? %>
          <li><%= link_to orientation.class_time, new_orientation_registration_path(orientation) %>
              (<%= orientation.current_number_seats %>/<%= orientation.seats %>)</li>
        <% elsif orientation.class_date.before Date.today %>
          <li><%= orientation.class_time %>(Class Closed)</li>
        <% end %>
        <% else %>
          <li><%= orientation.class_time %>(Class full)</li>
        <% end %>
      <% end %>
    <% end %>

您正在查看的是调度应用程序的前端日历视图。根据不同的状态,您会在日历上看到每天的不同信息,即剩余座位数、“全班”与管理员的其他信息。我应该以某种方式将此逻辑拉入我的模型或控制器吗?

4

2 回答 2

0

给猫剥皮的方法有很多。哪个是“正确的”与个人喜好一样重要。也就是说,这里有一些您可能需要考虑的想法。

为每种类型的用户使用部分 这可能是也可能不是您的驱动问题,但最外层的决策是基于用户类型的,因此为每种类型的用户构建一个部分可能是有意义的。在这种情况下,您可能有“active_user_orientation_view”和“guest_orientation_view”。这样做会将您的视图(本节)缩减为一个单独的 if-then-else 语句,并非常清楚地表明您的意图——注册用户看到一件事,而客人看到另一件事。

将重复代码封装到辅助方法 中 两个列表项是使用完全相同的代码生成的。让它干燥!例如,我可能会下拉到 OrientationsHelper (app/helpers/orientations_helper.rb) 并添加一个像这样的 #orientation_full_item 助手

def orientation_full_item(orientation)
  content_tag(:li) do
    "#{orientation.class_time} (Class full)"
  end
end

有了这个助手,渲染“类已满”消息的两行可以减少到 <%=orientation_full_item(orientation)%>。您可以对提供注册表单链接的列表项执行相同操作。为了保持一致性,您可以对所有列表项执行此操作。这会给你一个非常清楚地表明其意图的视图。

考虑使用 Presenter 与其在模型(业务逻辑)中乱扔面向视图的便捷方法,更好的选择是创建一个接受类实例并提供相同便捷方法的新类。这就是 Presenter 模式的全部意义所在。它的优点是您可以非常清楚地按照它的意图组织您的代码——商业逻辑保持在一起并且与视图逻辑保持解开。在这种情况下,您可能会提供一个 ActiveUserOrientationPresenter 和一个 GuestOrientationPresenter 类,它们中的每一个都提供了一个 #list_item 便捷方法,该方法能够使用其适当的内容呈现列表项。

PragProg 的家伙有一个由 Bruce Williams 撰写的标题,其中包含一些关于如何构建强大的视图代码的很好的建议,这些代码和时间投入可能是值得的。可用的代码片段之一专门针对演示者。您可以阅读http://media.pragprog.com/titles/warv/present.pdf

于 2013-11-02T20:11:57.960 回答
-1

<li>编写单元测试,用 XPath确定所有这些项目的内容。

GrabNokogiri并使用Nokogiri::HTML::BuilderRuby 编写所有内容:

builder = Nokogiri::HTML::Builder.new do |doc|
   doc.ul {
     doc.li('data 1')
     doc.li('data 2') if oodles_of_poodles?
     doc.li('data 3')
   }
end

puts builder.to_html

现在它都在一种语言中,您可以自由地重构它,而不会经常绊倒将两种语言混合在一起所需的转义标记。

于 2013-11-01T15:57:20.840 回答