🗂

[Rails]カテゴリタグの追加と、検索バー実装

2023/02/10に公開

https://zenn.dev/airiswim/articles/382c6085e1c4fa

ここでも記述した、検索機能の実装と要領は一緒です😀

今回作成するもの

  • カテゴリタグ投稿機能
    => 投稿後はindexにも表示
  • カテゴリタグ検索機能
  • 検索表示ページ

1 ."カテゴリ"保存カラム作成

Bookモデルのテーブルに、category カラム(string型)を作成したい。

<カラム追加コマンド>

rails g migration Addカラム名Toテーブル名 カラム名:データ型 この形式に則って
今回に当てはめると、
rails g migration AddCategoryToBooks category:string 実行!

作成後は、rails db:migrate 忘れずに!

なんでmigrationファイル書き直しダメなん??

rails db:rollback で前に反映したものを未反映にしてから
再度 rails db:migrateで反映することもできるよな…。

⇒ 一度実行したマイグレーションファイルの再実行は駄目!
反映済のマイグレーションファイルを直接いじってはいけない!
= 複数人で開発しているとDB周りに差分が出来たりするとバグる

補足:カラムのターミナルでの確認方法

rails runner 'puts モデル名.column_names'
上記したコマンドで確認可能!!!!
rails runner 'puts Book.column_names'

作成できてますね😀

補足:カラムの型の変更がしたい!

カラム変更コマンド => rails g migration ChangeDatatypeカラム名Of Table名
今回実はcategoryカラム作成時、カラムの方を間違えてしまった。笑
rails g migration ChangeDatatypeCategoryOfBooks
=> コマンド実行で生成されたマイグレーションファイルを編集していきます。

class ChangeDatatypeJobIdOfReviews < ActiveRecord::Migration[6.0]
  def change
    change_column :books, :category, :string
  end
end

※ 記述型change_column :テーブル名, :変更するカラム名, :変更するデータ型
最後は、migrateすること。

コントローラーでもカテゴリーカラムを保存できるように修正

<book.rb>

private
  def book_params
    params.require(:book).permit(:title,:body,:star,:category) #ここ
  end

2.モデルにバリデーションの記述

からでの投稿はなし!!!
<book.rb>

validates :category, presence: true

3. tag_search controllerを作る,actionかく

rails g controller Tagsearches

class TagSearchesController < ApplicationController
  def search
    @model = Book 
    @word = params[:content]
    @books = Book.where("tag LIKE?","%#{@word}%")
    render "searches/result"
  end
end

**検索用メソッドで、必ずというほど出てくる where(LIKE)**文。
whereメソッドにSQLのLIKE句で検索条件を記述していく!!!

whereメソッド

テーブル内の条件に一致したレコードを配列の形で取得することができるメソッド!
<基本の記述型>

モデルクラス.where("列名 LIKE ?", "%値%")  # 値(文字列)を含む
モデルクラス.where("列名 LIKE ?", "値_")   # 値(文字列)と末尾の1文字

4. Routingの設定

<route.rb>

get 'tagsearches/search', to: 'tagsearches#search'

5. viewの編集をしていく

①まずは投稿form部分から!

:
省略
:
<div class="form-group">
    <label>Category</label>
    <%= f.text_field :category,class: 'form-control book_category' %>
</div>

②Book作成後のbook/showページにも記述

ここの部分!!!!

:
省略
:
<td>
 <% if @book.category.present? %>
   <%=link_to@book.category,tagsearches_search_path(content:@book.category)%>
 <% end %>
</td>
  • ここで、私がif文にしたことには理由があって、categoryにバリデーションをかけたわけだが。
    この機能を作成する前にも、本の感想の投稿はあったわけで、
    categoryがない投稿もあって変になってしまったので、”もしcategoryがあったら”の文にしました。

  • もう一点ポイント!!
    そのcategoryにもリンクをつけて、共通のタグページに飛ぶようにしました♡

③同じように、book/indexページにも記述

ここは、全く同じです。省略。

④検索バー表示部位の作成

  • HEADERの下にログイン中のみ全部のページで表示していきたいので…
    <application.html.erb>
  <% if user_signed_in? %>
     <%= render 'tagsearches/tagsearch' %>
  <% end %>

<_tagsearch.html.erb>

<div class="serch_form" >
 <table align="center">
   <tr>
     <div class="serch_form">
      <%= form_with url: tagsearches_search_path,method: :get, local: true do |f| %>
     <td><%= f.text_field :content %></td>
     <td><%= f.submit'タグ検索' %></td>
      <% end %>
     </div>
   </tr> 
 </table>  
</div>

⑤検索結果表示ページの作成

<tagsearch.html.erb>

<h2><%= @model %>s search for "<%= @content %>"</h2>

<table class="table table-hover table-inverse">
    <thead>
      <tr>
        <th></th>
        <th>Title</th>
        <th>Opinion</th>
        <th>Tag</th>
      </tr>
    </thead>
    <% @books.each do |book| %>
    <tbody>
      <tr>
        <td><%= image_tag book.user.get_profile_image, size:'50x50' %></td>
        <td><%= book.title %></td>
        <td><%= book.body %></td>
        <td><%= book.category %></td> 
        <td>コメント数:<%= book.book_comments.count %></td>
      </tr>
    </tbody>
  <% end %>
</table>

これで完成!!

地道に、着実に。

Discussion