0

我在 rails4 博客应用程序的视图中有此代码。看起来真的很丑,如果可能的话,有人可以帮助我如何将它变成一个助手。

<h4>Archive</h4>
<%# This is really awful. I know. %>
<% @posts = BlogNgin::Post.order('created_at DESC') %>
<% archive_array = [] %>
<% @posts.each do |post| %>
<% date = post.created_at.strftime("%m") + " " + post.created_at.strftime("%Y") %>
<% if !archive_array.include? date %>
<% archive_array << date %>
<% end %>
<% end %>
<% archive_array.each do |date| %>
<% date = date.split(' ') %>
<%= link_to Date::MONTHNAMES[date[0].to_i].to_s + " " + date[1],     blog_ngin.root_path + date[1] + '/' + date[0] %><br />
<% end %>
4

1 回答 1

0

我很确定有人可以做得比这更好,或者如果这是最好的方法,但这里有一些你可以做的事情。您可以将中间部分提取到辅助方法中。

def archive(posts)
  <% posts.each do |post| %>
    <% archive_array = [] %>
    <% date = post.created_at.strftime("%m") + " " + post.created_at.strftime("%Y") %>
    <% if !archive_array.include? date %>
      <% archive_array << date %>
    <% end %>
  <% end %>
end

所以现在你的视图看起来像这样。

<h4>Archive</h4>
<%# It's probably still awful %>
<% @posts = BlogNgin::Post.order('created_at DESC') %>
<% archive_array = archive(@posts) %>
<% archive_array.each do |date| %>
<% date = date.split(' ') %>
<%= link_to Date::MONTHNAMES[date[0].to_i].to_s + " " + date[1],     blog_ngin.root_path + date[1] + '/' + date[0] %><br />
<% end %>

您可以删除此行<% @posts = BlogNgin::Post.order('created_at DESC') %>并将其在控制器操作中设置为@posts = BlogNgin::Post.order('created_at DESC') 不确定是否可以将其更改为范围以执行类似 @posts = 的操作BlogNgin::Post.desc

您还可以将最后一部分转移到另一个辅助方法,如下所示我不太确定您是否可以直接使用辅助文件中的 link_to 方法,但我认为它应该可以工作。

def links(archive_array)
  MONTHNAMEs = #put your array here
  <% archive_array.each do |date| %>
  <% date = date.split(' ') %>
  <%= link_to Date::MONTHNAMES[date[0].to_i].to_s + " " + date[1],     blog_ngin.root_path + date[1] + '/' + date[0] %>
  <% end %>
end

所以你的观点看起来像这样(希望如此)

<h4>Archive</h4>
<%# It's probably still awful %>
<%= links(archive(@posts)) %>
于 2013-08-19T07:50:07.480 回答