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