问题描述
我有一个实现了 pg_search 的图书馆管理应用程序;一切正常,突然间它开始在索引上显示所有项目,但我没有更改有关该功能的任何内容。 我会留下所有相关的代码,请告诉我是否需要更多的东西。 提前致谢。
book.rb
class Book < ApplicationRecord
belongs_to :user
has_many :loans
belongs_to :category
has_one_attached :photo
validates :title,presence: true
validates :author,presence: true
include PgSearch::Model
pg_search_scope :search_by_full_name,against: [:title,:author],using: {
tsearch: {
prefix: true
}
}
def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |book|
csv << book.attributes.values_at(*column_names)
end
end
end
#self.per_page = 12
end
book_controller.rb
class BooksController < ApplicationController
before_action :authenticate_user!
def index
if params[:term].present?
@books = Book.search_by_full_name(params[:term])
@books = policy_scope(Book)
else
@books = Book.paginate(page: params[:page])
@books = policy_scope(Book)
end
end
def show
@book = Book.find(params[:id])
authorize @book
end
def new
@user = User.find(params[:user_id])
@book = Book.new
@categories = Category.all.map{|c| [ c.name,c.id ] }
authorize @book
end
def create
@user = User.find(params[:user_id])
@book = Book.new(book_params)
# @book.category_id = params[:category_id]
@book.user = @user
authorize @book
if @book.save
redirect_to user_books_path
flash[:notice] = 'Success. Your book was added to the Library'
else
render "new"
flash[:notice] = 'Book not created. Please try again'
end
end
def edit
@user = User.find(params[:user_id])
@book = Book.find(params[:id])
@categories = Category.all.map{|c| [ c.name,c.id ] }
authorize @book
end
def update
@book = Book.find(params[:id])
@book.category_id = params[:category_id]
@book.update(book_params)
authorize @book
redirect_to user_book_path
end
def destroy
@book = Book.find(params[:id])
@book.destroy
authorize @book
redirect_to user_books_path
end
private
def book_params
params.require(:book).permit(:title,:author,:photo,:comments,:category_id)
end
end
_book_search_bar.html.erb
<%= form_tag user_books_path(:user_id),method: :get,class: "search-bar" do %>
<%= text_field_tag 'term',params[:term],placeholder: "Enter book or author" %>
<br>
<br>
<%= submit_tag "SEARCH BOOK",class: "btn-main" %>
<% end %>
解决方法
您只是重新分配了 @books = policy_scope(Book)
,这将同时删除搜索范围和分页。
def index
if params[:term].present?
@books = Book.search_by_full_name(params[:term])
else
@books = Book.paginate(page: params[:page])
end
@books = policy_scope(@books)
end
代替类传递实际作用域给专家或将其颠倒过来:
def index
@books = policy_scope(Book).then do |scope|
if params[:term].present?
scope.search_by_full_name(params[:term])
else
scope.paginate(page: params[:page])
end
end
end
停止工作,没有更改代码
不太可能。更有可能的是,回归是在实施 Pundit 时引起的,并且没有检测到它的测试。事情不会神奇地发生。