スポンサーリンク

2016年8月10日

[Elixir]ページネーション(Scrivener)の検証

Goal

  • 最新(2016/8/10)のScrivenerパッケージの使い方を試す

Dev-Environment

開発環境は下記のとおりです。
  • OS: Windows8.1
  • Erlang: Eshell V8.0, OTP-Version 19.0
  • Elixir: v1.3.0
    • Phoenix Framework: v1.2.0
    • Scrivener: v2.0.0
    • Scrivener_html: v1.3.1
    • Scrivener_ecto: v1.0

Context

以前に利用をさせていただいてから大分時間が経過していますので、
ページネーション用のパッケージであるGithub - drewolson/scrivenerがどれくらい変わったのか試してみます。
プロジェクトの作成などは特にしません。(ソース中は”TutorialVerification”となっていますので、適宜変更してください)
まずは、パッケージを追加します。

File: mix.exs

defmodule TutorialVerification.Mixfile do
  ...

  # Specifies your project dependencies.
  #
  # Type `mix help deps` for examples and options.
  defp deps do
    [...
     {:scrivener, "~> 2.0"},
     {:scrivener_ecto, "~> 1.0"},
     {:scrivener_html, "~> 1.3.1"}]
  end

  ...
end
次にconfig.exsへ設定を追加します。

File: config/config.exs

use Mix.Config

...

config :scrivener_html,
  routes_helper: TutorialVerification.Router.Helpers

import_config "#{Mix.env}.exs"
repo.exでScrivenerをuseします。
:page_sizeはデフォルトのページサイズです。

File: lib/[my_app_name]/repo.ex

defmodule TutorialVerification.Repo do
  use Ecto.Repo, otp_app: :tutorial_verification
  use Scrivener, page_size: 10
end
表示用に適当なモデル、コントローラ、ビューを追加します。
面倒なので、Phoenixのコマンドを利用してしまいましょう。

Example:

> mix phoenix.gen.html User users name:string email:string
...
作成されたビューへScrivener.HTMLのimportを追加します。

File: web/views/user_view.ex

defmodule TutorialVerification.UserView do
  use TutorialVerification.Web, :view
  import Scrivener.HTML
end
適当な表示用データが欲しいので、seeds.exsで投入してしまいましょう。
下記のようにすれば100個のデータが入ります。

File: priv/repo/seeds.exs

alias TutorialVerification.{Repo, User}

Enum.each(1..100, fn(number) ->
                    User.changeset(%User{}, %{name: "test#{number}", email: "test#{number}@test.com"})
                    |> Repo.insert!
                  end)
コントローラのindexアクションを下記のように変更します。

File: web/controllers/user_controller.ex

defmodule TutorialVerification.UserController do
  ...

  def index(conn, params) do
    users = User
            |> order_by(desc: :name)
            |> Repo.paginate(params)

    render(conn, "index.html", users: users)
  end

  ...
end

Note: Repo.paginate/2のコンフィグで直接、ページとページサイズを指定することができます。

下記のようにすると、(:page)2ページ目の表示指定と(:page_size)DBか20個のデータを取得するようになります。

defmodule TutorialVerification.UserController do
  ...

  def index(conn, params) do
    users = User
            |> order_by(desc: :name)
            |> Repo.paginate(page: 2, page_size: 20)

    render(conn, "index.html", users: users)
  end

  ...
end
テンプレートへページネーションのリンクを作成するようにします。
下記のようになります。

File: web/templates/user/index.html.eex

<h2>Listing users</h2>

<div>
  <%= pagination_links @conn, @users %>
</div>

<table class="table">
  ...
</table>

<div>
  <%= pagination_links @conn, @users %>
</div>

<%= link "New user", to: user_path(@conn, :new) %>
実行して表示を見てみましょう。
ページのparamsで指定していればページ移動もできています。
変わったと感じたのは、やはりテンプレートの部分ですね。
scrivener_ectoの部分は基本的に変わっていないと思います。
scrivener_htmlでページリンクが作れるようになったのは便利ですね。
前に使ったときは、ページリンクのテンプレート部分を自分で作っていたので…。
これなら、Phoenixチュートリアルのソースも減りますね。
(…厚い本が薄くなるかも???(冗談))
個人的に思ったのは、パッケージがそれぞれ別々になっているのはなんでなんでしょう?
別に一つに統合してもいい気がしますが?まぁ、作成者様に私には思いつかない何か考えがあるのでしょう。
使う上では特に支障もありませんしね。

Bibliography

参考にした書籍及びサイトの一覧は下記になります。

人気の投稿