2014-01-30 3 views
4

Я пытаюсь добавить Kaminari в мое приложение Rails. Я включил драгоценный камень, и это то, что мой контроллер выглядит следующим образом:kaminari undefined method 'page'

def index 
    if params[:year] 
     if params[:year].size > 0 
     @songs = Song.where("year like ?", params[:year]).page(params[:page]) 
     elsif params[:artist].size > 0 
     @songs = Song.where("artist_name like ?", params[:artist]).page(params[:page]) 
     elsif params[:song].size > 0 
     @songs = Song.where("title like ?", params[:song]).page(params[:page]) 
     end 
    else 
     @songs = Song.first(10).page(params[:page]) 
    end 
    end 

, а затем добавить

<%= paginate @songs %> 

на мой взгляд, ошибка я получаю:

undefined method `page' for #<Array:0x007fab0455b4a8> 

Не почему это происходит, поскольку я следовал за шагом docs для шага.

ответ

18

Kaminari использует paginate_array для разбивки массива. 2 решения:

Во-первых, вы можете использовать limit(10) вместо first(10):

@songs = Song.limit(10).page(params[:page])

Во-вторых, используйте paginate_array

@songs = Kaminari.paginate_array(Song.first(10)).page(params[:page])

+0

Способ, которым это структурировано, касается меня: работает ли 'paginate_array' на уже разрешенном запросе? – allanberry

2

Я бы посоветовал вам немного переписать свой контроллер. Еще лучше переносите фильтры в модель или в класс фильтра. Посмотрите на present? для тестирования наличия params, так как это будет проверяться на наличие nil и empty.

def index 
    @songs = Song 

    @songs = @songs.where("year like ?", params[:year])   if params[:year] 
    @songs = @songs.where("artist_name like ?", params[:artist]) if params[:artist] 
    @songs = @songs.where("title like ?", params[:song])   if params[:song] 

    @songs = @songs.limit(10).page(params[:page]) 
end