🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

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

Q&A

解決済

1回答

893閲覧

複数カラムをまたいでユーザー検索が出来ない。

punchan36

総合スコア105

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

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

0グッド

0クリップ

投稿2021/03/05 05:26

前提・実現したいこと

ユーザー検索において、ユーザー名(:name)とキーワード(:introducion、自己紹介欄の中身)での絞り込み機能を実装しました。

しかしユーザー名の絞り込みではヒットするものの、キーワード検索ではユーザーがヒットせず、ユーザー一覧(User.all)が表示されてしまいます。

該当のソースコード

Gemfile

gem 'ransack'

routes.rb

get 'users/index' => 'users#index'

users_controller.rb

ruby

1class UsersController < ApplicationController 2 def index 3 if params[:name || :introduction].present? 4 @users = User.where(['name LIKE ? AND introduction LIKE ?', "%#{params[:name]}%", "%#{params[:introduction]}%"]).page(params[:page]).per(20) 5 else 6 @users = User.all.order(created_at: :desc).page(params[:page]).per(20) 7 end 8 9 # ユーザーが該当しなかった時。 10 if @users == [] 11 @users = User.all.order(created_at: :desc).page(params[:page]).per(20) 12 end 13 end 14end

users/index.html.erb

<%= form_with url: users_path, method: :get, local: true do |f| %> <p>User name</p> <%= f.text_field :name %> <p>Keyword</p> <%= f.text_field :introduction %> <%= f.submit :search %> <% end %> <% @users.each do |user| %> <div><%= link_to(user.name, "/users/#{user.id}") %></div> <% end %>

試したこと

実は一度、上記のコードで上手く動いていたのです。
ですので次に性別(:sex)でも絞り込みをかけようとコードを追加 → ビューにて動作確認をしていました。

ですが上手く動かなかったため、性別(:sex)関連のコードを一旦消し、再びユーザー名(:name)とキーワード(:introducion)のみの状態に戻しました。すると動いていたはずのキーワード(:introducion)の絞り込みも動かなくなった、と言う経緯がありました。

因みに追加していた性別(:sex)関連も含めたコードは以下の通りです。

users_controller.rb

ruby

1class UsersController < ApplicationController 2 def index 3 if params[:name || :introduction || :sex].present? 4 @users = User.where(['name LIKE ? AND introduction LIKE ? AND sex LIKE ?', "%#{params[:name]}%", "%#{params[:introduction]}%", "%#{params[:sex]}%"]).page(params[:page]).per(20) 5 else 6 @users = User.all.order(created_at: :desc).page(params[:page]).per(20) 7 end 8 9 # ユーザーが該当しなかった時。 10 if @users == [] 11 @users = User.all.order(created_at: :desc).page(params[:page]).per(20) 12 end 13 end 14end

users/index.html.erb

<%= form_with url: users_path, method: :get, local: true do |f| %> <p>User name</p> <%= f.text_field :name %> <p>Keyword</p> <%= f.text_field :introduction %> <p>Gender</p> <%= f.radio_button :sex, :value => "Male" %>Male <%= f.radio_button :sex, :value => "Female" %>Female <%= f.submit :search %> <% end %> <% @users.each do |user| %> <div><%= link_to(user.name, "/users/#{user.id}") %></div> <% end %>

同じコードを記述していても、例えばその前に起こしたアクション等の影響でコードが動かなくなる様な事は有り得るのでしょうか?

コードの間違いが見つけられませんでしたので、質問させて頂きました。
どなたかご助言を頂けますと有難いです。

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

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

gem 'ransack' を取り込んでいるなら、その絞り込みを使えば良いのに、、、
if params[:name || :introduction || :sex].present?
これは params[:name].present? と等価です, params[:introduction], params[:sex] が有っても無視されます。

つまり、 params[:introduction があり params[:name] がない場合
params[:name || :introduction || :sex].present? => params[:name].present? => false となり else の @users = User.all`が実行されています。

if params[:name].present? || params[:introduction].present? || params[:sex].present? とか

if [:name, :introduction, :sex].any?{|item| params[item]present?} とか

投稿2021/03/05 11:58

winterboum

総合スコア23567

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

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

punchan36

2021/03/06 03:33

有難うございます! ご教示頂きましたコードで上手く動きました。 仮にif params[:name || :introduction]などと[]内で値をorで並べた場合、最初の値(ここでは :name)のみの結果が反映されると言う決まりがあるのでしょうか?「present? 複数」などで調べましたが情報に辿り着けませんでした…。 確かにif params[:name || :introduction]の記述で一度上手く動いたと思ったのですが、本来そのような事は有り得ないでしょうか?
punchan36

2021/03/06 06:19

orがこの様な仕様だったのですね。 勉強不足でした。有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問