如何使带有link_to的复选框成为参数?

时间:2018-11-27 21:50:14

标签: ruby-on-rails slim-lang

我有一个带有电影和类别的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

1 个答案:

答案 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操作。

注意::我不熟悉苗条的语法,因此如果出现语法错误,请进行调整:)。