将Searchkick与分页

时间:2015-10-02 10:57:51

标签: ruby-on-rails ruby ruby-on-rails-4 elasticsearch searchkick

我正在尝试在我的Rails应用上实施搜索功能,以使搜索框正常工作。

但是,在运行代码时,会引发以下错误:

NoMethodError in PostsController#index undefined method `paginate' for #<Searchkick::Results:0x007f3ff123f0e0>

(我还有一个标签云,如果我保持下面的代码不变,它工作正常,但如果我将@posts = @posts更改为@posts = Post.search,它也会破坏标签功能。)

我正在使用:

  • Rails 4.2.0
  • ruby​​ 2.2.1p85(2015-02-26修订版49769)[x86_64-linux]

代码:

以下是我PostsController的样子:

class PostsController < ApplicationController
  before_action :find_post, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show]

  def new
    @post = current_user.posts.build
  end

  def create
    @post = current_user.posts.build(post_params)

    if @post.save
      redirect_to @post
    else
      render 'new'
    end
  end

  def edit
    @post = Post.friendly.find(params[:id])
  end

  def update
    @post = Post.friendly.find(params[:id])
    if @post.update(post_params)
      redirect_to @post
    else
      render 'edit'
    end
  end

  def destroy
    @post.destroy
    redirect_to root_path
  end

  def index
    if params[:tag]
      @posts = Post.tagged_with(params[:tag]).paginate(page: params[:page], per_page: 5)
    else
      @posts = Post.order('created_at DESC').paginate(page: params[:page], per_page: 2)
    end

    if params[:nil].present?
      @posts = @posts.search(params[:nil]).paginate(page: params[:page])
    else
      @posts = @posts.paginate(page: params[:page])
    end
  end

  def show
    @post = Post.friendly.find(params[:id])
  end

  def autocomplete
    render json: Post.search(params[:query], autocomplete: true, limit: 5).map(&:title)
  end

  private

  def find_post
    @post = Post.friendly.find(params[:id])
  end

  def post_params
    params.require(:post).permit(:title, :description, :content, :tag_list, :preview)
  end
end

这是我的导航栏搜索表单的样子

<li class="navs">
    <%= form_tag posts_path, method: :get do%>
        <%= text_field_tag :search, params[:query], placeholder: "Search Blog", name: "nil" , required: "", class: "input-field", id: "post_search", autocomplete: "off" do %>
            <%= submit_tag "", class: "material-icons search-box" %>
        <% end %>
        <% if params[:search].present? %>
            <%= link_to "X", posts_path %>
        <% end %>
    <% end %>
</li>

我经常搜索,无法找到具体的答案,这些答案可以帮助我找到正确的方向来解决我的错误。

我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

问题是,search调用将返回Searchkick::Results个集合,而不是ActiveRecord::Relation。后者已经使用paginate方法进行了修补,而前者没有进行修补,从而提高了NoMethodError

根据documentation,你应该能够通过将分页参数传递给search方法来完成这项工作:

@posts = @posts.search(params[:nil], page: params[:page])