Kaminari oraz acts as taggable on

Cześć! Od paru godzin walczę z gemem acts-as-taggable-on oraz Kaminari.

Tagowanie działa - mogę dodawać wpisy i określić jakie tagi chce, Kaminari też działa, wyświetla tylko 2 wpisy na strone - wszystko jest ok - problem pojawia się dopiero gdy z listy tagów wybiorę jeden i chcę zobaczyć wszystkie wpisy z takim samym tagiem - pojawia się błąd:

undefined method `current_page' for #<ActiveRecord::Relation:0x00000004c8a380>

Problem znika gdy z pliku app/views/posts/index.html.erb skasuję <%= paginate @posts %>.

posts_controller.rb

[code] def index

if params[:tag]
@posts = Post.tagged_with(params[:tag])

else
@posts = Post.all
@posts = Post.order(“created_at DESC”)
@posts = Kaminari.paginate_array(@posts).page(params[:page]).per(2)

end

respond_to do |format|
  format.rss { render :layout => false }
  format.html # index.html.erb
  format.json { render json: @posts }
end

end[/code]
models/post.rb

[code]class Post < ActiveRecord::Base

attr_accessible :content, :name, :created_at, :title, :tag_list
acts_as_taggable

validates :name, :presence => true
validates :title, :presence => true,
:length => { :minimum => 5 }

has_many :comments
end[/code]
routes.rb

[code]Blog::Application.routes.draw do
resources :pages, except: :show

ActiveAdmin.routes(self)

devise_for :admin_users, ActiveAdmin::Devise.config

get ‘tags/:tag’, to: ‘posts#index’, as: :tag
resources :posts do
resources :comments
end

get ‘:id’, to: ‘pages#show’, as: :page

root :to => ‘posts#index’

end[/code]
Czy tu jest coś źle? Robiąc to korzystałem z dwóch railscastów i wiki poszczególnych gemów, podałem kod wszystkich plików które modyfikowałem.

Odpowiedź na Twoje pytanie jest bardzo prosta, ale postaram się napisać tak, żebyś na przyszłość wiedział też gdzie szukać.

Po pierwsze, jeśli nie ma jakiejś metody na na obiekcie danej klasy, to musisz się zastanowić dlaczego tak jest. “current_page”, to niewątpliwie metoda dodawana przez kaminari, więc łatwo się domyślić, że w tym wypadku kolekcja, na której wywoływana jest ta metoda nie ma nic wspólnego z kaminari. Teraz spójrz, czym się różnią te dwie linijki:

    @posts = Kaminari.paginate_array(@posts).page(params[:page]).per(2)
    @posts = Post.tagged_with(params[:tag])

Pierwsza z nich będzie związana z kaminari, druga z nich, kompletnie nic o kaminari nie wie. Spróbuj zrobić coś takiego:

  @posts = Post.tagged_with(params[:tag]).page(params[:page]).per(2)

Kolejna sprawa, masz kilka innych drobnych błędów. Przede wszystkim nie rób Post.all przed order etc. Railsy powinny same wiedzieć, że wyciągasz kolekcję i dodać .all w ostatnim możliwym momencie. Spróbuj to napisać w ten sposób:

[code=ruby]def index
@posts = Post
@posts = @posts.tagged_with(params[:tag]) if params[:tag]
@posts = @posts.order(“created_at DESC”).page(params[:page]).per(2)

respond_to do |format|
  format.rss { render :layout => false }
  format.html # index.html.erb
  format.json { render json: @posts }
end

end[/code]
Kod będzie bardziej przejrzysty i bez niepotrzebnych powtórzeń.

Dziękuję! Wszystko działa tak jak chciałem! Twoje rady zapisane w notatniku! :wink: