Rails创建视图助手

时间:2013-08-19 07:32:36

标签: ruby-on-rails helper actionviewhelper

我在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 %>

1 个答案:

答案 0 :(得分: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)) %>