前提
Ruby(Rails)を利用して、誕生日などの記念日を管理するアプリを作成しています。
登録した記念日を一覧表示して、「次の記念日まで何日か」「次は何日記念か」
などを表示させたいです。
実現したいこと
- 記念日からの経過日数を計算し、配列に設定した次の記念日候補と一致する値を表示させるには、 controller、あるいはモデルにどのように記述すればよいか。 ※例:次は100日記念日です。次は10年記念日です。などと表示させたい
- ルーティングに個別のid情報を持たない、indexアクションなどで、個別の投稿情報を取得して、各種計算をするにはどうすればよいか確認したい。
※現状はcontroller内で、Userに紐づく記念日の投稿情報を全て取得 ⇨ Viewでeachメソッドを利用して一覧出力しています
該当のソースコード
ruby
1class ListsController < ApplicationController 2 def index 3 @user = User.find(params[:user_id]) 4 @anniversaries = @user.anniversaries 5 end 6end
↑@anniversariesにUserに紐づく記念日の情報を代入していますが、個々の記念日情報に対して計算をするなどしたいです。
ruby
1Rails.application.routes.draw do 2 devise_for :users 3 resources :anniversaries 4 resources :users, only: [:index, :show] do 5 resources :lists, only: :index 6 end 7end
※listsモデルはUserモデルにネストしています。
ruby
1<div class="container"> 2 <table class="table"> 3 <caption>ブレークポイント</caption> 4 <thead> 5 <tr class="column"> 6 <th></th> 7 <th>記念日</th> 8 <th>経過日数</th> 9 <th>次の記念日名</th> 10 <th>次の記念日の日付<br>残日数</th> 11 </tr> 12 </thead> 13 14 <tbody> 15 <% @anniversaries.each do |anniversary| %> 16 <tr> 17 <td><%= image_tag anniversary.image %></td> 18 <%# 記念日 %> 19 <td><%= anniversary.anniversary_date %></td> 20 <%# 経過日数 %> 21 <td><%= "#{(@today - anniversary.anniversary_date.next_day(0)).to_i}日" %></td> 22 <%# 次の記念日名 %> 23 <td><%= "#{条件に一致する、次の記念日までの日数を返したい}日記念" %></td> 24 <%# 次の記念日の日付 %> 25 <td><%= (anniversary.anniversary_date.next_day(条件に一致する、次の記念日までの日数を返したい)) %><br> 26 <%# 残日数 %> 27 <%= "残り#{(anniversary.anniversary_date.next_day(条件に一致する、次の記念日までの日数を返したい) - @today).to_i}日" %></td> 28 </tr> 29 <% end %> 30 </tbody> 31 </table> 32 </div>
補足情報(FW/ツールのバージョンなど)
ruby 2.6.5
至らない説明などあるかもしれませんが、よろしくお願いします。
> ※現状はcontroller内で、Userに紐づく記念日の投稿情報を全て取得 ⇨ Viewでeachメソッドを利用して一覧出力しています
この現状ではどのような問題があるのでしょうか?
コメントをありがとございます。確かに問題がうまく説明できていませんでした。
現状の問題点は、次の記念日候補を動的に表示させる事ができない点になります。
例えば、 controller上で「@next_anniversary = 1000」をインスタンス変数としておいて、
View上でeachメソッドを活用して、出力した全てのデータに対して「次の記念日は1000日後です」
と表示することはできても、誕生日などの記念日は人によって異なるので、@next_anniversaryに代入する値を、それぞれの次の誕生日候補を代入して、eachメソッドで出力した各データ別に、次の記念日は100日記念や、次の記念日は500日記念というふうにViewに表示をさせたいです。
show アクションであればあらかじめ個別のid情報が、showアクションを実行する時点で取得できているので実装できそうですが、あくまでindexアクションなど実行される時点で個別のid情報を持っていない状態でどのように実装すればいいかがわからないです。
---ruby
<% @anniversaries.each do |anniversary| %>
<%# 記念日の日付 %>
<%= anniversary.anniversary_date %>
<%# 次の記念日候補 %>
<%= "#{@next_anniversary}日記念" %><
<%# 次の記念日の日付 %>
<%= (anniversary.anniversary_date.next_day(@next_anniversary)) %>
---

回答2件
あなたの回答
tips
プレビュー