初めに
Ruby on Railsで作成しているブログのコンテンツ一覧などの昇順/降順にするメソッドとページネーションを実装するためのgem kaminariの実装メモです。
降順/昇順にするにはorderメソッドを使う
-
order
メソッドは、テーブルから取得してきたインスタンスたちを並び替えるメソッドである。
昇順の場合
contents_controller.rb
# 省略
def index
@contents = Contents.all.order("id ASC")
end
降順の場合
contents_controller.rb
# 省略
def index
@contents = Contents.all.order("id DESC")
end
-
all
メソッドを利用した場合、通常であればレコードはid順に取得されるが、上記のようにorder
メソッドの引数として(“id DESC”)とすれば、レコードを逆順に並び替えられる。 -
また、
order
メソッドを利用する場合は、以下のようにall
メソッドを省略することができる。
contents_controller.rb
# 省略
def index
@contents = Contents.order("id DESC") # allメソッドを省略できる
end
ページネーション(kaminari)の実装
- kaminariをいうGemの一種をインストールすることによって実装可能。
1. Gemfileの最後の行にkaminariを追記
Gemfile
# (省略)
gem 'kaminari'
2. bundle installを実行
ターミナル
bundle install
- 必ずローカルサーバーを再起動することを忘れずに。
kaminari:pageメソッド
- kaminariを導入すると、モデルクラスにpageメソッドが定義される。
- このメソッドは、ページネーションにおけるページ数を指定する。
- ビューのリクエストの際に
params
中にpageというキーが追加されて、その値がビューで指定した番号になる。よってpageの引数はparams[:page]
となる。
kaminari:perメソッド
-
per
メソッドもpageメソッドと同様に、kaminariを導入することで使えるメソッドである。 - 1ページあたりに表示する件数を指定する。
-
per
メソッドに引数をして渡した数字が、ページネーションが実装されたビューで1ページあたりに表示する件数になる。
上記2つのメソッドは以下のような記述方法になる。
sample_controller.rb
変数名 = クラスを利用して取得したレコードのインスタンス.page(params[:page].per(ここに1ページで表示したい件数を入力)
contentsコントローラーのindexアクションに今度は投稿日時の降順で記述し、さらにページネーションを導入した記述をしてみると以下のようになる。
contents_controller.rb
# 省略
def index
@contents = Contents.order("created_at DESC").params[:page].per(5)
end
kaminari:paginateメソッド
- ページネーションのリンクを表示したいときに使用するメソッド。
- kaminariをインストールすると利用できます。paginateメソッドの引数は、コントローラで定義した変数を指定する。
viewには<%= paginate(@contents) %>
と記述すればよい。
contents.html.erb
<div>
<% @contents.each do |content| %>
# 省略
<% end %>
<%= paginate(@contents) %>
</div>
最後に
gemを入れると使える便利なメソッドがどんどん増えてとても便利。
積極的に使っていこうと思った。