実装に躓いているのでアドバイスいただきたいです。
モデルに自分の考えるロジックを記述したのですがうまく行きません。(一番下に乗せてあります)
また、同じ画面にform_withを複数使用しているため検索ボタンを押すとストロングパラメータの箇所にエラーが出てしまいます。
【機能】
星レビュー投稿機能+検索
一番上がカラム名 こんな感じの項目でチェックボックスを作る↓ カラムの項目ごとにチェックボックスを作り、絞り込み検索を実装したいと考えています。(下にschema乗せてます)
star | sex | age |
---|---|---|
星1 | 男性 | 10代 |
星2 | 女性 | 20代 |
星3 | 30代 |
【画面】
一覧: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)を削除することで解決しましたが、今度は新規投稿しようとするとエラーが出てしまいます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。