やりたいこと
現在railsでタスク管理アプリを作成しています。
enumで定義したタスクの状態を検索フォームにcheck_box
として
(□未着手 □着手中 □完了)このような形で作成し、
絞り込み検索を行いたいです。
現在viewには上記のような形でcheck_boxは表示されているのですが、
絞り込みがうまく機能してくれません。
今まではradio_button
で実装しており、問題なく機能していたのですが
複数選択や選択の取り消しなど、使い易さを考えてcheck_boxに変更したいと考えています。
現在のソースコード
model
ruby
1class Task < ApplicationRecord 2 3 enum status: { waiting: 0, working: 1, completed: 2 } 4 5 def self.status(status_by) 6 case status_by 7 when "waiting" 8 waiting 9 when "working" 10 working 11 when "completed" 12 completed 13 else 14 all 15 end 16 end 17end
controller
ruby
1class TasksController < ApplicationController 2 def index 3 @tasks = Task.name_like(params[:name]). 4 status(params[:status]). 5 order(sort_param) 6 @status = params[:status] 7 end
メソッドチェインで「タイトル」、「状態」、「並び替え」で検索できるように考えています。
index
html
1<%= form_with url: tasks_path, method: :get do |f| %> 2 <p> 3 <%= f.label :status, Task.human_attribute_name(:status) %> 4 <%= f.collection_check_boxes :status, Task.statuses, :first, :first do |s| %> 5 <%= s.check_box value: @status %> 6 <%= s.label { Task.human_attribute_name("status.#{s.text}")} %> 7 <% end %> 8 </p> 9 <p><%= f.submit "検索" %></p> 10<% end %>
試したこと
check_boxで一つを選択し検索ボタンを押してサーバのlogを見ると、status
のparameter
が配列の中身に問題がありそうなのと、そもそもcollection_check_boxes
を使用するのが正しいのかが分かりません。
Started GET "/tasks?name=&status%5B%5D=&status%5B%5D=waiting&sort=new&commit=%E6%A4%9C%E7%B4%A2" for ::1 at 2021-04-22 09:00:01 +0900 Processing by TasksController#index as HTML Parameters: {"name"=>"", "status"=>["", "waiting"], "sort"=>"new", "commit"=>"検索"} Rendering layout layouts/application.html.erb Rendering tasks/index.html.erb within layouts/application Task Load (1.9ms) SELECT "tasks".* FROM "tasks" ORDER BY created_at DESC ↳ app/views/tasks/index.html.erb:39 Rendered tasks/index.html.erb within layouts/application (Duration: 10.0ms | Allocations: 7853) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 16.0ms | Allocations: 11084) Completed 200 OK in 18ms (Views: 14.6ms | ActiveRecord: 1.9ms | Allocations: 12039)
バージョン情報
ruby 3.0.0
Rails 6.1.3.1
その他
radio_button
で問題なく機能していた際のコードも載せておきます。
ruby
1<%= f.label(:status, Task.human_attribute_name(:status)) %> 2<%= f.collection_radio_buttons(:status, Task.statuses, :first, :first) do |r| %> 3 <%= r.radio_button(checked: r.value == params[:status]) %> 4 <%= f.label(Task.human_attribute_name("status.#{r.text}")) %> 5<% end %>
調べても情報が少ないため質問させていただきました。
実装のアドバイスをいただけると大変助かります。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー