2016-06-21 33 views
0

我是Rails的新手,我正在嘗試搜索我的應用程序。未定義的方法`text_search'for#<Array:0x00000005876838>

我使用pg_search,在我做分頁之前。搜索和分頁工作得很好,但一個地方我得到一個錯誤:

undefined method `text_search' for #

有人可以幫我解釋一個錯誤嗎? 我試圖尋找答案,但我不明白我的情況中的這個錯誤。

我的用戶控制器:

require 'will_paginate/array' 

    class UsersController < ApplicationController 
     before_action :set_agent, only: [:index, :new, :create] # For nested /users/:user_id/users 
     before_action :authenticate_user!, only: [:show, :edit, :update] 
     before_action :authenticate_admin!, only: [:accept_agent] 

     respond_to :js, :only => [:users_list, :admins_list, :locked_list, :agents_list] 

     def index 
     users = filter_by_params(params, @agent) 
     @users = users 
     @users = @users.text_search(params[:query]).paginate(:page => params[:page], :per_page => 10) 
     end 

和我model/user.rb

include PgSearch 
    pg_search_scope :search_name, :associated_against => { 
     :orders => [:client_name]} 


    def self.text_search(query) 
    if query.present? 
     search_name(query) 
    else 
     all 
    end 
    end 
+0

嘗試:User.text_search(params [:query])。paginate(:page => params [:page],:per_page => 10)。或者只是刪除自己,如果你想調用特定的對象。 – 7urkm3n

+0

text_search是User類中的一個類方法。要調用它們是正確的是User.text_search(...) –

+1

儘量保持您的代碼最小化。在這裏你分配給變量'users',然後去並立即重新分配給'@ users'。如果這是您的目標,您可以直接將它們直接分配給「@用戶」。 – tadman

回答

1

你有兩個問題。

首先,filter_by_params給你一個數組(大概是用戶)。

在這個結果上你試圖調用text_search,但是這是你定義它的一個類方法,這意味着(如註釋所述),它將通過'User.text_search(.. )'而不是通過特定的用戶對象(這將是一個實例方法)。我建議對差一些谷歌的研究,一個地方開始將是:

http://www.railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/

想必你想限制你分頁'通過filter_by_params然後text_search的用戶,盡我所能猜猜看,雖然從你的問題或代碼中不清楚。

第一步很可能是處理陣列中的每個用戶的時間,是這樣的:

users = filter_by_params(params, @agent) 
users.each { |user| 
    next if user.text_search(...) # After rewriting this as an instance method 
} 

,如果你正在嘗試做分頁的filter_by_params以及我不能告訴。你只能在ActiveRecord上使用will_paginate gem,所以如果你想使用它,你需要弄清楚你的過濾是什麼,並通過ActiveRecord來完成。無論如何,這可能會更有效率。

相關問題