0
0

More than 1 year has passed since last update.

7 Rails 新たなRouting、Controllerのアクションは追加しないで検索機能 , ジャンル検索機能を実装する

Last updated at Posted at 2022-11-09

検索機能の流れ

1 検索フォームを作成する。
2 モデルにメソッドを定義する。
3 アクションを編集する。

1 検索フォームを作成する

<%= form_with url: admin_items_path, local: true, method: :get do |f| %>
  <%= f.text_field :word %>
<% end %>

このフォームで送られるパラメータは、、、

{"utf8"=>"✓", "word"=>"×××", "controller"=>"admin/items", "action"=>"index"} 
ポイント

クエリパラメータは特に、設定しなくても使える

クエリパラメータの作り方
book_path(book.id)
本来は、book_path(id: book.id) (idというキーにbook.idという値を入れる)

params[:word]
本来は、book_path(word: “xxx”) => wordというキーに値を入れる

複数のキーに値を入れる
book_path(word: “xxx”, search: “yyyy”)

nameというキーに値をform_withで入れる(この時のメソッドは、get)
<%= f.text :name %>

2モデルにメソッドを定義する

def self.looks(word)
    if word
        @items = Item.where("name LIKE?", "#{word}")
    else
        @items = Item.all
    end
end
ポイント

1 if文でwordに値があるか(wordに値が与えらたかどうかで)条件分岐させている。

2

Item.where("name LIKE?", "#{word}")

Itemテーブルの中のnameカラムからwordの値(検索フォームで入力された値)が
含まれているものを取得している。

3

else
   @items = Item.all
end

検索フォームに何も入力してないとき、全ての商品を表示する。

この記述が無いと検索フォームに名前を入力しないと商品が表示されない:scream:

3 コントローラーのアクションを編集する

def index
   @items = Item.looks(params[:word])
end

このlooksは、2で定義された

ジャンル検索機能の流れ

1 アクションを編集する

def index
    @genres = Genre.all
    if params[:genre_id]
      @genre = Genre.find(params[:genre_id])
      @items = @genre.items.all
    else
      @items = Item.all
    end
  end
ポイント

1

 if params[:genre_id]

パラメータで、genre_idに値がある(値が送られてきたかどうか)で、条件分岐させる

2

@genre = Genre.find(params[:genre_id])

送られてきた、genre_idと同じidのGenreを取得する

3

@items = @genre.items.all

@genreに関連するitemを全て取得し、@itemsに格納させる

4

else
  @items = Item.all
end

パラメータで、genre_idが無いときitemを全て表示させる。
この記述が無いと検索フォームに名前を入力しないと商品が表示されない:scream:

2 genre_idをアクションに送る

<% @genres.each do |genre| %>
   <p><%= link_to genre.name ,  items_path(genre_id: genre.id) %></p>
<% end %>

この時のパラメータ

<ActionController::Parameters {"genre_id"=>"1", "controller"=>"public/items", "action"=>"index"}

ポイント: link_toに任意のパラメータを付与する方法

例:

名前付きルート(group_id: 1, team_id: 2)

この時のURL

.../.../...?group_id=1?team_id=2

コントローラーで受け取る方法

params[:group_id]
params[:team_id]
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