プログラミング

Ruby on Railsで月別アーカイブを実装する方法(かなり丁寧に解説)

今回はRuby on Railsで下記のような、月別アーカイブを実装する方法を説明します。
該当の年月を押せばその年月に投稿されたデータのみを表示する画面に遷移させます。
ブログや、投稿型のWebアプリに使えるかと思います。

やり方は様々あるかと思います。
このやり方が「正解」とは思わず、あくまでも参考にして下さい。

説明していきます。
前提として、controllerであれば、application_controllerじゃなくても問題なしです。
共通フッターやサイドバーに表示したいのであれば。application_controllerが望ましいです。

1行目

ユーザーのデータをインスタンス変数に格納

・詳しく
indexTableテーブルに格納されている、ログインユーザーに紐づく、レコードを「@hoge」と言うインスタンス変数に代入します。
なので「@hoge」には各ユーザーに紐づく全レコードが格納されている状態です。
テーブル名はご自身で作ったテーブル名に変更してください。

2行目

5行目辺りでデータを配列に格納するため、空の配列を作成しておきます。

 

3行目

1行目に代入したデータを一つずつ取り出すため、each文を使って、変数hogehogeに格納します。

4行目

2行目で作った配列に、引数のデータが存在するかを判定します。

・詳しく
unlessはif文の逆です。
if文は 「もし~であれば」下の行を実行。しますが
unlessは「もし~じゃなければ」下の行が実行されます。

include?メソッドはyearmonth引数の値が含まれているかを判定します。
引数の「created_at.strftime(‘%Y%m’)」はレコードが作られた時間を「yyyymm」形式で表示させるメソッドです。
例えば、配列の中に201910のデータが入ってるかどうかを判定し、なければ下の行に移ります。
なので1週目は空っぽ配列なので確実に通りますが、201910の投稿が二つ以上あってもデータ重複しないための処理です。

 

5行目

unless分岐が通ったら、yearmonth配列にpush、つまり入れます。
4行目で重複しないよう処理してるので同じ年月のデータは被らないようにしてます。

7行目

@YearMonthArchiveに配列のデータを代入して、viewに受け渡します。

※今思うと、配列の中に重複データがあれば削除するメソッドがあったはずなので、
それを使ったほうが早いかもです。。。w

続いてviewで、受け渡された値をアーカイブ形式で表示させ、クリックしたら該当の年月のみのデータが表示するページに遷移する処理を実装します。

2行目

月別アーカイブが存在しなければ13行目以降が実行されます。

4行目

.reverse_eachはeachとは反対の順番で一つずつ取り出すメソッドです。
日付を降順で出力するため。

6行目

url変数にcontrollerから受け渡されたデータをコピーし代入

7行目

url.insert(4, “-“)はurlの値の4文字目に「-」を挿入します。
201910であれば2019-10となります。
理由は後程解説します。

8行目

6行目と同様

9行目

7行目と同様で4文字目「年」を挿入

10行目

<li><a href=”/month_view_<%= url %>-1″><%= year %>月</a></li>
これでリンク先のURLが/month_view_2019-10-1となり、出力が「2019年10月」
になります。
each文なので、存在するデータにの年月分だけ、出力されることになります。

続いてroutes.rbを見ていきます。

/month_view_:monthとなっているので、2019-10-1がパラーメータとなりhogege_controllerに受け渡され、hogege_controllerのmonth_viewアクションが走ります。

3行目の:month に指定した年月(2019-10-1)が受け渡され、.in_time_zone.all_monthメソッドでその日にちを含む月のデータのみを全て代入します。
なのでこの場合だと2019年10月に投稿されたデータのみが@MonthMemberRegistHistoriesに代入されます。

後は、month_view.html.erbで@MonthMemberRegistHistoriesを使いデータを表示させれば、月別アーカイブが完成です。

説明が下手で申し訳ないです。わからなければTwitterなどで聞いてください。
そして最初にも言いましたがこれが最適解ではない可能性もあるので、参考にしてもらえれば幸いです。

お疲れさまでした。

 

プログラミング学習管理アプリ「プロスタ」をリリースしました。
是非ご活用ください。
ProSta

 

COMMENT

メールアドレスが公開されることはありません。