Rails部分重载逻辑需要重构

时间:2010-08-29 04:59:17

标签: ruby-on-rails refactoring ruby-on-rails-3 partial-views

你如何重构这个充满逻辑的部分?

<%- for post in @posts -%>
  <div class="post">
    <%= link_to post.title, post %>

    <%- if post.name.empty? -%>

    <%- else -%>   
      <span class="name">
        by 
        <%- if post.email.blank? -%>
          <%= post.name %>
        <%- else -%>
          <a href="mailto:<%= post.email %>"><%= post.name %></a>
        <%- end -%>
      </span>
    <%- end -%>

    <span class="time">
      active &#32; <%= timeago(post.updated_at) %>
    </span>

    <%- if post.comments.empty? -%>
      <span class="reply">
        <%= link_to 'reply', :controller => 'posts', :action => 'show', :id => post %>
      </span>
    <% else %>
      <span class="reply">
        <%= link_to pluralize(post.comments.count, 'reply'), :controller => 'posts', :action => 'show', :id => post %>
      </span>
    <%- end -%>

    <p><%= sanitize post.content,
 :tags => %w(a embed img object p param),
 :attributes => %w(allowfullscreen allowscriptaccess href name src type value) %></p>

    <%- unless controller.controller_name == "tags" -%>
      <%- unless post.tag_list.nil? || post.tag_list.empty? -%>
        <%- post.tags.each do |t| -%>
          <div class="tag"><%= link_to t.name.titleize, tag_path(t) %></div>
        <%- end -%>
      <%- end -%>
    <%- end -%>

    <%- unless post.comments.empty? -%>
      <div class="comments">
        <%= render :partial => post.firstcomments %>
        <%- if post.comments.count >= 4 -%>
          <%= link_to 'more...', :action => 'show', :id => message %>
        <%- end -%>
      </div>
    <%- end -%>
  </div>
<%- end -%>

注意: post.firstcomments只返回3个最新帖子。 使用Rails 3和Ruby 1.9.2。 我没有查看代码的清理部分,并且我意识到Rails 3在默认情况下会逃避所有内容,所以现在可以安全地忽略它,除非有人知道如何转换它。

我的模型很干净,我的控制器很不错,但这部分很糟糕。它完成了它需要做的事情,但它在刷新页面时占用了大部分渲染时间。非常感谢评论,建议和代码。感谢您阅读我的问题。

1 个答案:

答案 0 :(得分:1)

我不知道我是否愿意趟过这条路,但我会让你开始。

<%- if post.name.empty? -%>
<%- else -%>   
  <span class="name">
    by 
    <%- if post.email.blank? -%>
      <%= post.name %>
    <%- else -%>
      <a href="mailto:<%= post.email %>"><%= post.name %></a>
    <%- end -%>
  </span>
<%- end -%>

可以重构为这样的东西:

<%= by_post_name post %>

#post_helper.rb
def by_post_name post
  post.name.empty? ? "" : "<span>#{post.email.blank? ? post.name : mail_to post.email, post.name}</span>"
end

这样的简单事情:

<%- if post.comments.empty? -%>
  <span class="reply">
    <%= link_to 'reply', :controller => 'posts', :action => 'show', :id => post %>
  </span>
<% else %>
  <span class="reply">
    <%= link_to pluralize(post.comments.count, 'reply'), :controller => 'posts', :action => 'show', :id => post %>
  </span>
<%- end -%>

与:

相同
<span class="reply">
  <%- if post.comments.empty? -%>
    <%= link_to 'reply', :controller => 'posts', :action => 'show', :id => post %>
  <% else %>
    <%= link_to pluralize(post.comments.count, 'reply'), :controller => 'posts', :action => 'show', :id => post %>   
  <%- end -%>
</span>

也有帮助。像我在第一个例子中所做的那样,将空注释逻辑粘贴在辅助方法中。

这一点对渲染时间没有任何帮助。重构视图逻辑主要是为了您自己和任何必须阅读您的代码并且不太可能对速度产生任何影响的人的利益。