2016-06-21 4 views
0

Я новичок в Rails, и я пытаюсь выполнить поиск для своего приложения.Неопределенный метод `text_search 'для # <Массив: 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). Или просто удалите self uf u хотите вызвать определенный объект. – 7urkm3n

+0

text_search - метод класса внутри класса User. Чтобы называть их правильным, User.text_search (...) –

+1

Постарайтесь, чтобы ваш код был минимальным. Здесь вы назначаете переменную 'users', а затем переходите и немедленно переназначаете ее на' @ users'. Вы можете просто назначить непосредственно «@ users» в первую очередь, если это ваша цель. – tadman

ответ

1

У вас есть две проблемы.

Во-первых, filter_by_params предоставляет вам массив (предположительно для пользователей).

В этом результате вы пытаетесь вызвать text_search, но это метод класса, как вы его определили, что означает (как отмечалось в комментарии), что он будет вызываться через «User.text_search» (..) ', а не через определенный пользовательский объект (который был бы методом экземпляра). Я предлагаю некоторые исследования Google на разницу, одно место для начала было бы:

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, а также. Вы можете использовать камень will_paginate на ActiveRecord, поэтому, если вы хотите использовать это, вам нужно выяснить, что такое ваша фильтрация, и делать это через ActiveRecord. Это, вероятно, будет более эффективным в любом случае.