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”となっていますので、適宜変更してください)
ページネーション用のパッケージである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はデフォルトのページサイズです。
: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のコマンドを利用してしまいましょう。
面倒なので、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個のデータが入ります。
下記のようにすれば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で指定していればページ移動もできています。
ページのparamsで指定していればページ移動もできています。
変わったと感じたのは、やはりテンプレートの部分ですね。
scrivener_ectoの部分は基本的に変わっていないと思います。
scrivener_htmlでページリンクが作れるようになったのは便利ですね。
前に使ったときは、ページリンクのテンプレート部分を自分で作っていたので…。
これなら、Phoenixチュートリアルのソースも減りますね。
(…厚い本が薄くなるかも???(冗談))
scrivener_ectoの部分は基本的に変わっていないと思います。
scrivener_htmlでページリンクが作れるようになったのは便利ですね。
前に使ったときは、ページリンクのテンプレート部分を自分で作っていたので…。
これなら、Phoenixチュートリアルのソースも減りますね。
(…厚い本が薄くなるかも???(冗談))
個人的に思ったのは、パッケージがそれぞれ別々になっているのはなんでなんでしょう?
別に一つに統合してもいい気がしますが?まぁ、作成者様に私には思いつかない何か考えがあるのでしょう。
使う上では特に支障もありませんしね。
別に一つに統合してもいい気がしますが?まぁ、作成者様に私には思いつかない何か考えがあるのでしょう。
使う上では特に支障もありませんしね。
Bibliography
参考にした書籍及びサイトの一覧は下記になります。