与pundit一起使用searchkick:策略范围错误

问题描述 投票:0回答:2

我正在尝试实现一个带有过滤选项的基本搜索引擎,但我陷入了 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>

我不知道在哪里创建策略范围,因为每次我尝试对搜索结果建立索引时,它都会返回此错误消息:

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

预先感谢您的帮助!

ruby-on-rails elasticsearch pundit searchkick
2个回答
0
投票

试试这个

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

更新 SearchKick V5 或更高版本

Searchkick 不再允许在关系上调用

search
。如果您使用的是最新版本的 Searchkick,上述解决方案将不起作用。

您必须使用 Searchkick 的查询接口来确定结果范围。

class ProductsController < ApplicationController
  def index
    allowed_product_ids = policy_scope(Product).pluck(&:id)
    if params[:query].present?
      @products = allowed_products.search(params[:query], where: {id: allowed_product_ids})
    else
      @products = allowed_products
    end
  end

Searchkick 变更日志在关系上调用搜索时引发错误


0
投票

搜索结果必须直接在视图中实现,而不是在控制器中!不管怎样,谢谢:)

© www.soinside.com 2019 - 2024. All rights reserved.