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 に答える