0

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

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

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

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

我在用:

  • 导轨 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>

我进行了很多搜索,但找不到任何具体的答案可以给我一个正确的方向,让我知道我做错了什么。

我真的很感激任何帮助。

4

1 回答 1

1

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

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

@posts = @posts.search(params[:nil], page: params[:page])
于 2015-10-02T12:07:36.600 回答