Использование searchkick с pundit: ошибка policyscope - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь реализовать базовую c поисковую систему с опциями фильтрации, и я застрял на реализации searchkick. Вот мой код:

class ProductsController < ApplicationController
  def index
    if params[:query].present?
      @products = policy_scope(Product.search(params[:query]))
    else
      @products = policy_scope(Product)
    end
  end
class Product < ApplicationRecord
  searchkick
<h1>Products Index</h1>

<%= form_tag products_path, method: :get do %>
  <%= text_field_tag :query,
    params[:query],
    class: "form-control",
    placeholder: "Chercher par produit ou marque"
  %>
  <%= submit_tag "Rechercher", class: "btn btn-primary" %>
<% end %>
<br>

<ul>
  <% @products.each do |product| %>
     <li><%= link_to product.name, product_path(product) %></li>
     <%= cl_image_tag product.photos.first.key, height: 550, width: 550, crop: :fill, quality: 100 %>
  <% end %>
</ul>

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

undefined method `all' for #<Searchkick::Results:0x00007f9f117b6530> Did you mean? all?

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Попробуйте это

class ProductsController < ApplicationController
  def index
    allowed_products = policy_scope(Product)
    if params[:query].present?
      @products = allowed_products.search(params[:query])
    else
      @products = allowed_products
    end
  end

Область действия политики ожидает "ванильного" отношения, но .search возвращает что-то слишком сложное, решение состоит в том, чтобы сначала ограничить область действия и вызвать .search в конце

0 голосов
/ 06 августа 2020

Результат поиска должен был быть реализован непосредственно в представлении, а не в контроллере! В любом случае спасибо :)

...