目的
ユーザーの詳細ページから指定した日の投稿数を求めたい
考え方
ユーザーの詳細ページでのアクションなのでuser_controllerに記述(viewも同様)
form_withで調べたい日付を送信してbookのcreated_atで検索をかける
検索結果をcountで数え、表示する
前提条件
ruby 3.1.2
Rails 6.1.7
device、bootstrap導入済み(bootstrapは見た目の問題なので機能には関係なし)
User及びBookモデル作成済み
1.ルーティング、コントローラー設定
routesの記述
resources :users, only: [:index,:show,:edit,:update] do
get 'search' => 'users#search'
end
rails routesでルーティングの確認
user_search GET /users/:user_id/search(.:format) users#search
コントローラーの記述
def search
user_books = User.find(params[:user_id]).books #user_idで取得したユーザの本の一覧を取得
created_time = params[:created_at] #created_atをcreated_timeに代入
if created_time == ""
@search_book = "日付が選択されていません"
else
@search_book = user_books.where(created_at: created_time.to_date.all_day).count
end
end
created_time = params[:created_at]には日付を選ばなかった場合
[1] pry(#<UsersController>)> created_time
=> ""
となるので、 "" の時、日付が入力されていない旨のコメントを表示します
またcreated_timeに日付を選んで送信した時は
[2] pry(#<UsersController>)> created_time
=> "2022-12-06"
と日付までしか取得されないので、.to_date.all_dayを用いて
[3] pry(#<UsersController>)> created_time.to_date.all_day
=> Tue, 06 Dec 2022 00:00:00.000000000 UTC +00:00..Tue, 06 Dec 2022 23:59:59.999999999 UTC +00:00
その日の午前0時から午後11時59分59秒まで取得して、whereで検索をかけます
2.viewの記述
form_withにlocal: falseまたはdata{remote: true}を指定して非同期化します
また後に使うためidも指定
<div class ="mb-4">
<%= form_with url: user_search_path(@user), method: :get, local: false do |f| %>
<%= f.date_field :created_at %>
<%= f.submit '検索', class: 'btn btn-primary' %>
<% end %>
</div>
<div id="search_result"> #非同期化のためidを指定
<% if @search_book.present? %>
<%= render 'search', search_book: @search_book %>
<% end %>
</div>
@search_book.present?
オブジェクトが存在すればtrueを返し、存在しなければfalseを返すメソッド
@search_bookがある場合のみ部分テンプレートを表示します
次に新しく部分テンプレート_search.erbを作成
<h4>検索結果</h4>
<table class='table table-bordered'>
<thead>
<tr>
<th>投稿数</th>
</tr>
</thead>
<tbody>
<tr>
<td><%= search_book %></td>
</tr>
</tbody>
</table>
3.非同期処理
views/users/search.js.erbを作成し以下のように記述
$("#search_count").html("<%= j(render 'search', search_book: @search_book) %>");
$("# ")の中にはviews/users/_index_book.rbで指定したidを入力
("<%= j( ) %>");の中には部分テンプレートの埋め込みを同じように入力
最後に
ご覧いただいた方、ありがとうございました
意見、感想等ありましたらご自由にご記入ください
