April 12, 2015

Lapozás Rails-ben Kaminari-val

Ha egy lista túl sok elemet tartalmaz, érdemes lapozással kisebb szeletekre vágni a megjelenített tartalmat. Ennek több előnye is van, például: kicsit kímélhetjük az adatbázist, rövidíthetjük az oldalbetöltés idejét, stb. A kaminari gem lehetővé teszi, hogy ezt roppant egyszerűen megoldjuk.

Adjuk hát hozzá a Rails projektünk Gemfile-jához a kaminarit, majd telepítsük is azt bundler-rel.

gem 'kaminari'
bundle install

Generáljuk a szükséges konfigurációs fájlokat:

rails generate kaminari:config

Állítsuk be az alapértelmezett oldalméretet abban a model-ben, aminek a elemeit listázzuk. Ha például egy blog post-jait szeretnénk oldalanként megjeleníteni, akkor az app/models/post.rb-ba írjuk bele ezt:

paginates_per 10

Ez elintézi nekünk, hogy oldalanként 10 post jelenjen meg. (Persze ha 15-öt szeretnénk oldalanként, akkor 10 helyett 15-öt kell írnunk).

Következő lépésként a controller-ben kell módosítanunk a listázást. Ez esetünkben az app/controller/posts_controller.rb fájl, melynek az index method-ját módosítjuk:

# Ezt egészítsük ki
def index
  @posts = Post.all
end

# Erre
def index
  @posts = Post.order(:created_at).page(params[:page])
end

Végül a view-ban jelenítsük meg a lapozót, ahol szeretnénk. Ezt a példában az app/views/posts/index.html.erb fájlban az alábbi módon tehetjük meg:

<%= paginate @posts %>

Ezzel meg is volnánk, az oldalon megjelenik a lapozó!

Részletesebb leírás és sok példa elérhető Github-on: amatsuda/kaminari

Nandor Biro

Software Engineer working at Whereby, lover of all things countryside, life-long learner with a passion for IT and woodworking. Find him on Twitter.