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

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

詳細はこちら
Ruby on Rails 5

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

Ruby

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

2回答

2492閲覧

チェックボックスを使った絞り込み検索を行いたい

ooaai

総合スコア17

Ruby on Rails 5

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

Ruby

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2021/03/05 06:06

編集2021/03/05 07:35

実装に躓いているのでアドバイスいただきたいです。
モデルに自分の考えるロジックを記述したのですがうまく行きません。(一番下に乗せてあります)
また、同じ画面にform_withを複数使用しているため検索ボタンを押すとストロングパラメータの箇所にエラーが出てしまいます。


【機能】
星レビュー投稿機能+検索

一番上がカラム名 こんな感じの項目でチェックボックスを作る↓ カラムの項目ごとにチェックボックスを作り、絞り込み検索を実装したいと考えています。(下にschema乗せてます)

starsexage
星1男性10代
星2女性20代
星330代

【画面】
一覧:reviews/index.html.erb
投稿:_new.html.erb
検索:_search.html.erb

投稿画面と検索画面は部分テンプレートでindexから呼び出しているため、indexに2つのform_withがある状態です。新規投稿画面はモーダル表示にしているため部分テンプレートを使用。検索は別のコントローラを用意することも考えたのですが、モデルに検索のための条件分岐をしているためこのような形になりました。


【コード】
shema.rb↓

create_table "reviews", force: :cascade do |t| t.integer "room_id", null: false t.float "star", null: false t.string "name", null: false t.text "comment" t.string "sex", null: false t.string "age", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.decimal "score", precision: 5, scale: 3 end

reviews_controller.rb↓

class ReviewsController < ApplicationController def create review = Review.new({ room_id: review_params[:room], star: review_params[:star], comment: review_params[:comment], name: review_params[:name], age: review_params[:age], sex: review_params[:sex] }) review.score = Language.get_data(review_params[:comment]) review.save redirect_to reviews_path end def index @reviews = Review.review_search(review_params) end private def review_params params.require(:review).permit(:star, :name, :comment, :age, :sex, :room) end end

index.html.erb

<h4>レビュー一覧</h4> <!--絞り込み検索--> <%= render "reviews/review_search" %> <a class="modal-open review-new" href="">クチコミを投稿する</a> <!--レビュー一覧--> <%= render "reviews/index", reviews: @reviews %> <!--新規投稿(モーダル表示)--> <div class="modal"> <div class="modal_bg modal-close"></div> <div class="modal_content"> <%= render "reviews/new" %> <a class="modal-close" href="">×</a> </div> </div> <script> $(function(){ $(".modal-open").on("click",function(){ $('.modal').fadeIn(); return false; }); $(".modal-close").on("click",function(){ $(".modal").fadeOut(); return false; }); }); </script>

_new.html.erb

<h5>レビュー投稿</h5> <div class="wrapper"> <div class="form-wrapper"> <%= form_with model: Review.new, local: true do |f| %> <div class="evaluation"> <%= f.radio_button :star, "5" %> <label for="review_star_5" >★</label> <%= f.radio_button :star, "4" %> <label for="review_star_4" >★</label> <%= f.radio_button :star, "3" %> <label for="review_star_3" >★</label> <%= f.radio_button :star, "2" %> <label for="review_star_2" >★</label> <%= f.radio_button :star, "1" %> <label for="review_star_1" >★</label> </div> <div class="form"> <%= f.label :comment, "コメント" %> <%= f.text_area :comment %> <span class="focus-line"></span> </div> <div class="form"> <%= f.label :name, "名前" %> <%= f.text_field :name %> <span class="focus-line"></span> </div> <div class="select"> <%= f.label :age, "年代" %> <%= f.select :age, {10代: "10代", 20代: "20代", 30代: "30代", 40代: "40代", 50代: "50代" ,60代〜: "60代〜"}, { include_blank: "選択してください", selected: "" } %><br> <%= f.label :sex, "性別" %> <%= f.select :sex, {男性: "男性",女性: "女性"}, { include_blank: "選択してください", selected: "" } %><br> <%= f.label :room, "部屋タイプ" %> <%= f.select :room, {"type1": 1, "type2": 2, "type3": 3}, {include_blank: "選択してください"} %><br> </div> <%= f.submit "投稿", class: "review-button" %> <% end %> </div> </div>

_search.html.erb(現状は1つのカラムのチェックボックスしか作ってません。)
indexアクションに飛ぶようにurl: reviews_pathを指定しました。

<%= form_with model: Review.new, url: reviews_path, method: :get, local: true do |f| %> <p>性別</p> <%= f.check_box :sex, { multiple: true }, "男性", nil %> <%= f.label :sex, "男性" %> <%= f.check_box :sex, { multiple: true }, "女性", nil %> <%= f.label :sex, "女性" %> <%= f.submit "検索" %> <% end %>

review.rb

# レビュー絞り込み検索 scope :review_search, -> (search_params) do return if search_params.blank? room_type_in(search_params[:room_type_in].to_i) .star_in(search_params[:star_in]) .age_in(search_params[:age_in]) .sex_in(search_params[:sex_in]) end scope :room_type_in, -> (room) { where(room_id: room) if room.present?} scope :star_in, -> (star) { where(star: star) if star.present?} scope :age_in, -> (age) { where(age: age) if age.present?} scope :sex_in, -> (sex) { where(sex: sex) if sex.present?}

【ログ】
チェックを入れて検索ボタンを押した際のログです
イメージ説明


【エラー】
イメージ説明
検索時に出るエラーです。require(review)を削除することで解決しましたが、今度は新規投稿しようとするとエラーが出てしまいます。

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

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

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

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

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

guest

回答2

0

自己解決

review.rb(完成形)

scope :review_search, -> (search_params) do return if search_params.blank? room_type_in(search_params[:room]) .star_in(search_params[:star]) .age_in(search_params[:age]) .sex_in(search_params[:sex]) end scope :room_type_in, -> (room) { where(room_id: room.map{|n| n.to_i}) if room.present? } scope :star_in, -> (star) { where(star: star) if star.present? } scope :age_in, -> (age) { where(age: age) if age.present? } scope :sex_in, -> (sex) { where(sex: sex) if sex.present? }

・1行目 scope :review_search, -> (search_params) do
(search_params)には{"sex"=>["女性"]}で情報が渡ってきているため、.sex_in(search_params[:sex])というようにkeyを指定する。

・3行目 room_type_in(search_params[:room_type_in].to_i)だとnil場合のto_iをするとで「0」という値ができてしまうため、8行目でroom.to_iをする。配列で入ってきているためmapを使用して上記のような形になる。


reviews_controller.rb(ストロングパラメータ追加部分)

def review_search_params params.fetch(:review_search, {}).permit(star: [], age: [], room: [], sex: []) end

・ビューでのform_withの記述はscope: :review_searchを使用しました。
・値が配列で渡ってくるためsex: []のような記述をする

投稿2021/03/06 12:13

ooaai

総合スコア17

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

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

0

画像貼り付けは回答者としては嫌ですね。検索もコピペもできない。テキストで貼ってください。
で、
いくつか問題があります。
where(sex: sex) ここに渡る sex が 文字列でなく配列なので絶対hitしません。
{ where(age: age) if age.present?} age がないときこれは nil を返します。それ多分おかしなことを起こしそう

投稿2021/03/06 00:24

winterboum

総合スコア23567

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

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

ooaai

2021/03/06 06:38

回答ありがとうございます! 質問の仕方については改善させていただきます。ご指摘ありがとうございます。 問題点についてはこれから参考にして修正に取り掛かりたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問