質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

1回答

409閲覧

【Rails】クエリ文字列のキーを指定されたものに変更したい

Utsubo

総合スコア15

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

1クリップ

投稿2022/04/13 10:37

実現したいこと

結論のみ書くと、クエリ文字列のキーを指定されたものに変更したいです。

前提として、movieテーブルの中にname, description, is_showing(公開されているか)カラムがあり、indexアクションによってそれらを一覧を表示している状態です。
Ransack gemを使用して、検索フォームによりnameまたはdescriptionに含まれる文字を検索できるようにしました。また、ラジオボタンによって全てのmovies、公開されているmovies(is_showing=true)、公開されていないmovies(is_showing=false)を検索できるようにしています。また検索フォームとラジオボタンの併用もできるようにしています。

現在の状況としては、検索フォーム、ラジオボタンどちらも想定通りの動きをしておりますが、現在取り組んでいる課題のクリア条件を満たせておりません。
検索フォームを使って検索した場合、クエリ文字列が「q%5Bname_or_description_cont%5D=aaa&q%5Bis_showing_eq%5D=&commit=検索」となるため、前半の「q%5Bname_or_description_cont%5D=aaa」の部分を「keyword=aaa」となるように変更したいです。

発生している問題

エラーは発生しておりません。

該当のコード

ruby:routes.rb

1Rails.application.routes.draw do 2 get '/movies', to: 'movies#index' 3 get '/search', to: 'movies#search' 4 namespace :admin do 5 resources :movies, only: [:index, :new, :create, :edit, :update, :destroy] 6 end 7end

ruby:movies_controller.rb

1class MoviesController < ApplicationController 2 before_action :set_q, only: [:index, :search] 3 def index 4 @movies = Movie.all 5 end 6 7 def search 8 @results = @q.result 9 end 10 11 private 12 13 def set_q 14 @q = Movie.ransack(params[:q]) 15 end 16end

ruby:index.html.erb

1<h1>映画一覧</h1> 2 3<h2>映画検索</h2> 4<%= search_form_for @q, url: search_path do |f| %> 5 <%= f.search_field :name_or_description_cont %> 6 <%= f.radio_button :is_showing_eq, '', {:checked => true} %>全て 7 <%= f.radio_button :is_showing_eq, true %>上映中 8 <%= f.radio_button :is_showing_eq, false %>上映予定 9 <%= f.submit '検索' %> 10<% end %> 11 12<div class="movie_box"> 13 <% @movies.each do |movie| %> 14 <ul class="movie_item"> 15 <%= image_tag movie.image_url, size: '280x280' %> 16 <li><%= movie.name %></li> 17 <li><%= movie.year %></li> 18 <li><%= movie.description %></li> 19 </ul> 20 <% end %> 21</div>

試したこと

1つ目:
search_fieldメソッド内のsear:name_or_description_contという条件を使ってnameまたはdescriptionに検索フォームで入力した文字列がないか探していいますが、この:name_or_description_contという名前をkeywordに変更できないか、下記railsガイドで調べましたが、できそうにないと判断しました。
https://railsdoc.com/page/search_field
2つ目:
「rails クエリ文字列 変更」、「rails クエリ文字列 指定」など検索をしてみましたが、特に今回の件について解決できそうな記事は見当たりませんでした。

補足情報(FW/ツールのバージョンなど)

OS:macOS Big Sur Version 11.4
Rails: 6.1.3.2
ruby: 2.7.3

基礎的な内容だとは思いますが、数日間この問題で行き詰まってしまっております。
回答やヒント、アドバイス等いただけましたら幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2022/04/14 03:28 編集

何をしたいのか、がわかりません。 パラメーター部分が q%5Bname_or_description_cont%5D=aaa&q%5Bis_showing_eq%5D=&commit=検索 というのが keyword=aaa&q%5Bis_showing_eq%5D=&commit=検索 になるようにしたい、 ということですか? keyword という部分が場合によって変わる のですか?
Utsubo

2022/04/14 07:48 編集

winterboumさん ご指摘ありがとうございます。 おっしゃる通り、「keyword=aaa&q%5Bis_showing_eq%5D=&commit=検索 」となるように変更したいです。 keywordという部分は場合によって変わらず常に「keyword=xxx」という形にしたいです。 index.html.erb内の <%= f.search_field :name_or_description_cont %> の部分のname_or_description_contがそのままパラメータとして出ていると思いますが、この部分を単純に :keywordとしてしまうと、そもそも検索が出来なくなると考えております。 現在、プログラムの動作としてはすでに想定の動きをしておりますので、クエリ文字列として表示されるパラメータのみを上記のように変更したいです。
guest

回答1

0

ベストアンサー

でしたら簡単です
<%= f.search_field :name_or_description_cont %>

<%= text_field_tag :keyword %>

投稿2022/04/14 08:51

winterboum

総合スコア23347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Utsubo

2022/04/14 09:38

回答いただきありがとうございます。 変更したかったことができました。 ご指摘の通り<%= f.search_field :name_or_description_cont %>を<%= text_field_tag :keyword %>に置き換えると、クエリ文字列が「keyword=xxx」となりました。しかし、当たり前かもしれませんが、検索はできなくなりました。少し調べるとtext_field_tagは単体ではなくform_tagと併用するのですね。 調べながら実装していきたいと思います。 改めて、ご回答いただきありがとうございました。
winterboum

2022/04/14 09:52

検索できなくなるのはそのとおりです。 なので、なんでそんなことするのか、、、、というのが不思議で確認の質問をした次第。 >text_field_tagは単体ではなくform_tagと併用する のが普通の使い方ですが、text_field や search_field とことなり、form との結合は殆ど無いです。単に input type=text を作るだけです
Utsubo

2022/04/14 13:29

そうだったんですね、質問の意図が掴めず申し訳ないです。 現在、ある課題に取り組んでおり、commitした際に自動的にRSpecによりユニットテストが行われるようになっております。その中で、動作的には求められていることができているのですが、ユニットテストにひっかかってしまっており、困っておりました。 rspec ``` it '検索キーワードを指定するとそれを含むものだけ表示' do keyword = 'selected_movie' selected_movie_by_name = create(:movie, name: keyword) selected_movie_by_description = create(:movie, description: keyword) get :index, params: { keyword: keyword } expect(response.body).to include(selected_movie_by_name.name) expect(response.body).to include(selected_movie_by_description.name) expect(response.body).to not_include(@movies[0].name) expect(response.body).to not_include(@movies[1].name) expect(response.body).to not_include(@movies[2].name) end ``` expect(response.body).to not_include(@movies[0].name) expect(response.body).to not_include(@movies[1].name) expect(response.body).to not_include(@movies[2].name) 上記3行がfalseとなり、この箇所のみユニットテストが通っておりませんでした。 情報が小出しになってしまい、申し訳ございません。 課題を出していただいた所にも質問したのですが、回答がなく困り果てておりました。 また、今回は回答いただいた内容だけでなく、質問の仕方も勉強になりました。 次からは必要な情報をより整理してから質問いたします。 ご丁寧に回答いただきありがとうございました。
winterboum

2022/04/14 13:46

get :index, params: { keyword: keyword } これがおかしいです get :index, params: { q: { name_or_description_cont: keyword } }
Utsubo

2022/04/14 13:54

なるほど。上記のようにすればユニットテストは通りそうです。 ただし、私側でユニットテストを変更してしまうのは課題の意図に反すると思いますので、 再度、上記のことを課題の出題者に質問してみたいと思います。 元の質問とずれてきてしまいましたが、いろいろご親切にお答えいただきありがとうございました!
winterboum

2022/04/14 23:22

ことによるとその課題は、Ransac使わずに自力で検索文つくれ ってのではないかん?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問