やりたいこと
①投稿時にカテゴリータグ追加。 ②カテゴリーのリンク押すと、同じカテゴリーの投稿を取り出せる ("プログラミング"押すと、同じくプログラミングというタグで投稿されてる記事一覧を見れる)まずはカテゴリーを追加できるようにする
マイグレーションファイル記述
カテゴリーカラムを追加しました。
class CreateBooks < ActiveRecord::Migration[5.2]
def change
create_table :books do |t|
t.text :title
t.text :body
t.string :category
t.references :user,foreign_key:true
t.timestamps
end
end
end
Viewファイル
form_withで受け取る
<%= form_with model:@book,url:books_path,local:true do |f| %>
<label>Title</label>
<p><%= f.text_field:title %></p>
<label>Opinion</label>
<p><%= f.text_area:body %></p>
<label>カテゴリー</label>
<p><%= f.text_field:category %></p>
コントローラー修正
カテゴリーも保存できるように修正。private
def book_params
params.require(:book).permit(:title,:body,:category)
end
View
一覧画面にカテゴリー表示する。<% @books.each do |book| %>
<td><%= link_to user_path(book.user.id) do %>
<%= attachment_image_tag book.user, :profile_image,format: 'jpeg',size: "40x40", fallback: "no_image.jpg" %>
<% end %></td>
<td><%= link_to book_path(book.id) do %><%= book.title %></td>
<td><%= book.body %></td>
<td><%= book.category%></td>
ここまではカラムを追加するだけなので、なんてこともなくできました。
タグのリンクで検索できるようにする
コントローラー/ルーティング記述
books_controller.rb
def search_book
@book=Book.new
@books = Book.search(params[:keyword])
end
routes.rb
get "search_book" => "books#search_book"
Viewファイル記載 検索ワードを受け取る
viewを以下の通りに書き換えます。<td>
<%= link_to book.category, search_book_path(keyword: book.category) %>
</td>
book.categoryを、search_book_pathにkeywordとして送っています。
そのキーワードをコントローラーで受け取っています。
モデルファイルに検索方法記述
book.rb
def self.search(search_word)
Book.where(['category LIKE ?', "#{search_word}"])
end
完全一致で検索しています。
self.searchは、Book.searchですね。これはコントローラーから、(search_word)に入る値を送っています。
Viewの記述:検索結果の表示
views/books/search_book.html.erb
省略
<tr>
<% @books.each do |book| %>
<td><%= link_to user_path(book.user.id) do %>
<%= attachment_image_tag book.user, :profile_image,format: 'jpeg',size: "40x40", fallback: "no_image.jpg" %>
<% end %></td>
<td><%= link_to book_path(book.id) do %><%= book.title %></td>
<td><%= book.body %></td>
<td><%= link_to book.category, search_book_path(keyword: book.category) %></td>
省略