Как выбрать строки в таблице с помощью флажков и передать их в качестве параметров контроллеру - PullRequest
1 голос
/ 16 апреля 2019

У меня есть таблица, в которой отображается список предметов.Я пытаюсь выбрать несколько элементов в этой таблице и перейти к своему контроллеру, где я надеюсь визуализировать только специально выбранные элементы.

# 'products/index.html.haml'
%table.table
  %thead
    %tr
      %th Select
      %th Id
      %th Short description

  %tbody
    - @products.each do |product|
      %tr
        %td
          %input{ :type=>"checkbox", :checked=>"checked", :name=>"selected_products[]", :value=>product.id}
        %td
        %td= product.id
        %td= product.short_description

= link_to 'View selected', product_path(:selected_ids=>SELECTED_PRODUCT_IDS)

Как показано выше, отображается таблица, в которойпервый столбец является выбранным флажком с его значением, соответствующим его product.id - я пытаюсь передать массив этих идентификаторов, выбранных в параметры - то есть массив SELECTED_PRODUCT_IDS.

# 'controllers/product_controller.rb'
def index
   product_ids = params[:selected_form_datums]
   ...

вышепоказывает мой контроллер получения доступа к этому массиву.Я видел несколько ответов на похожие вопросы, предлагающих поместить это в тег 'form_for', однако все мои попытки пока что не дали результатов.

Буду признателен за любую помощь.

1 Ответ

2 голосов
/ 16 апреля 2019

Начните с создания отдельной переменной, содержащей @selected_products.

class ProductsController < ApplicationController
  before_action :set_product, only: [:show, :edit, :update, :destroy]

  # GET /products
  # GET /products.json
  def index
    @products = Product.all
    @selected_products = if params[:product_ids]
      @products.where(id: params[:product_ids])
    else
      @products # check all the checkboxes by default
      # or use Product.none for the opposite
    end
  end

  # ...
end

Это необходимо, поскольку у пользователя не будет возможности повторно добавлять элементы, если мы сделаем @products = Product.where(id: params[:product_ids]).

Затем просто создайте форму, которая соответствует вашему действию #index, с правильными флажками:

# Use `form_tag` instead for pre Rails 5 apps
= form_with(url: products_path, method: :get, local: true) do |form|
  %table.table
    %thead
      %tr
        %th Select
        %th Id
        %th Short description

    %tbody
      - @products.each do |product|
        %tr
          %td
            = check_box_tag('product_ids[]', product.id, @selected_products.include?(product))
          %td
          %td= product.id
          %td= product.short_description
  = form.submit('Filter products')

# this is just for demonstration
%h3 Selected products
- @selected_products.each do |p|
  %ul
    %li= p.short_description
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...