我有一个带有电影和类别的Rails 5.2.1应用程序。它们通过具有联接表的has_and_belongs_to_many
关系相互连接。
尝试执行以下操作:在“电影”的index
页上,我想通过选中“类别”复选框来筛选显示的电影集合。我可以正确显示类别的复选框,但是很难获取有关将哪些复选框检入参数的信息。
/ rails_app/app/views/movies/index.html.slim
h1 Listing movies
= collection_check_boxes(@movies, :category_ids, Category.all, :id, :name) do |box|
= box.check_box
= box.label
= link_to 'Filter movies on category', params.permit!.merge(filter: :category_ids)
table
/ table with movies that will be filtered
这些:category_ids
似乎是错误的。是否可以通过这种方式以某种方式获得复选框结果(以使用查询字符串参数进行进一步过滤)?我是否缺少某些东西,例如在我的控制器中?
# rails_app/app/controllers/movies_controller.rb
class MoviesController < ApplicationController
def index
@movies = Movie.all
end
...
def movie_params
params.require(:movie).permit(:name, :rating, category_ids: [])
end
end
上面是一个示例应用程序,由一些脚手架和一些编辑生成:
rails generate scaffold category name:string
rails generate scaffold movie name:string rating:integer
rails generate migration CreateJoinTableMoviesCategories movie category
bin/rails db:migrate RAILS_ENV=development
->将has_and_belongs_to_many :movies
添加到Category类
->将has_and_belongs_to_many :categories
添加到电影课
->在电影课的category_ids: []
中添加movie_params
答案 0 :(得分:1)
尝试一下,看看它是否适合您。
查看:
/ rails_app/app/views/movies/index.html.slim
= form_for :movie do |f|
= f.collection_check_boxes(:category_ids, Category.all, :id, :name) do |box|
= box.check_box
= box.label
= f.submit
/ table with movies that will be filtered
控制器:
# rails_app/app/controllers/movies_controller.rb
class MoviesController < ApplicationController
def index
@movies = if params[:movie]
Movie.joins(:categories).where(categories: { id: params[:movie][:category_ids] })
else
Movie.all
end
end
...
本质上,将复选框包装在表单中,然后在存在过滤器参数的情况下调整index
操作。
注意::我不熟悉苗条的语法,因此如果出现语法错误,请进行调整:)。