0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails]指定した日の投稿数を検索する方法(非同期化込)

0
Posted at

目的

ユーザーの詳細ページから指定した日の投稿数を求めたい

考え方

ユーザーの詳細ページでのアクションなのでuser_controllerに記述(viewも同様)
form_withで調べたい日付を送信してbookのcreated_atで検索をかける
検索結果をcountで数え、表示する

前提条件

ruby 3.1.2
Rails 6.1.7
device、bootstrap導入済み(bootstrapは見た目の問題なので機能には関係なし)
User及びBookモデル作成済み

1.ルーティング、コントローラー設定

routesの記述

routes.rb
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

コントローラーの記述

users_controller.rb
  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も指定

views/users/_index_book.rb
<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を作成

views/users/_search.html.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.js.erb
$("#search_count").html("<%= j(render 'search', search_book: @search_book) %>");

$("# ")の中にはviews/users/_index_book.rbで指定したidを入力
("<%= j( ) %>");の中には部分テンプレートの埋め込みを同じように入力

これで完成です!
スクリーンショット.png

最後に

ご覧いただいた方、ありがとうございました
意見、感想等ありましたらご自由にご記入ください

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?