[Rails]カテゴリタグの追加と、検索バー実装
ここでも記述した、検索機能の実装と要領は一緒です😀
今回作成するもの
- カテゴリタグ投稿機能
=> 投稿後は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