chroju.dev/blog

the world as code

Kaminariの実装をしてみた

久しぶりに稼働させているExhiBiというサービスの機能を少し更新した。といってもそれほど大した話ではないですが、一応書き留め。

kaminari

ページネーションでデファクトスタンダード状態であるkaminariを使ってみました。

bundlerでインストールすればほぼ設定とかなくても使えます。最初のローンチのときに入れなかったので、viewを結構いじらなくちゃいけなくて大変かなーと思っていたのだけど、そんなことはなかった。主に変更は2点で、まずはcontroller#indexのようなリソースを拾ってくるアクションに.pageをかましてやるようにします。

# もともとはExhibition.all.order...
def index
  @exhibitions = Exhibition.page(params[:page]).order("start_date DESC")
end

あとはviewでページネーションを表示するためのヘルパーを1行追加すれば終わり。以下はslimの場合。

= paginate @exhibitions

なお、実装当初はundefined method 'deep_symbolize_keys'などというちょっと関係ねーだろこれって感じのエラーが出たりして焦ったのは秘密です。原因はconfig/locales/ja.ymlが一切インデントされてなかったことなんですけど、そんなのがここに波及するんですね。。。てかyamlの書き方よくわかってねーわ。

もちろん、1ページあたりの表示数とかページャーの表示の仕方だとか、いろいろ細かく設定はできますが、とりあえずこれだけでページャーは実装されます。あーこりゃデファクトスタンダードになるわなという簡単さ。早く入れればよかった。なお、本当にまだ入れただけなのでCSSとかぜんぜん調整してないです。

id以外の要素でmodle#showにアクセスする

例えばExhiBiの場合は美術館ごとのページにアクセスするには、これまでmuseums/2みたいなURLになっていたわけですが、カッコ悪いし使い勝手も悪いのでmuseums/motなど、英名でアクセスできるよう変えました。参考にしたのは以下ページ。

やってることはなんともシンプルで、Museum.find(n)で呼んでいたところをMuseum.find_by_name_en_or_id(hoge)と出来るようにしただけですね。#to_paramでサービス内のリンクもすべて英名表記URLに変更できています。こういう柔軟さはRailsやっぱりいいですね。

ただ自分の場合ちょっと問題があったのは、これまでテーブルに英名表記のカラムを入れてなかったので、新たに追加する必要がありました。まぁ普通にbundle exec rake g migrationしてからrake db:migrateするだけなんですけど、ローカルで開発しているときに何故かこれが通らず、一旦rake db:migrate:resetしてから改めて打つハメになったりした。このへんの話は以下記事がちょっと詳しかったり。

自分はインフラエンジニアなので、Railsを実務で使うってことはほとんどこの先皆無だとは思うんですけど、自己表現手段としてやっぱりRailsぐらい使えておくと良さそうだなと改めて思います。例えばインフラの勉強でサーバー運用してみようとなっても、上で何か動いてないとあんまり勉強にならなかったり。自分がどんなことをしているのか?を外にアッピルする意味では、こういうの1つぐらい持っとくといいのだろうなと思います。yamlの勉強しなきゃとか、今回そういう派生効果もありましたので。近々作れたらもう1個サービス作ってみようと思ってます。