Как получить флажки с link_to в params? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть приложение 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 к классу категории
-> добавить has_and_belongs_to_many :categories к классу фильма
-> добавить category_ids: [] к movie_params вФильм класс

1 Ответ

0 голосов
/ 28 ноября 2018

попробуйте это и посмотрите, работает ли он для вас.

Вид:

    / 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 действие при наличии параметров фильтра.

Примечание: Я не знаком с тонким синтаксисом, поэтому настройте его, если вы получите синтаксическую ошибку:).

...