スポンサーリンク

2015年6月28日

[Elixir+Phoenix]EctoModelsの機能を使う

目的

PhoenixのEctoModels機能を把握する。

実行環境

OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.4
Phoenix Framework: v0.13.1
PostgreSQL: postgres (PostgreSQL) 9.4.4

始める前に

今までのTutorial記事の中で行っていることですが、
あまり説明もしていなかったのでまとめます。
プロジェクトの作成。
>cd プロジェクト作成ディレクトリ
>mix phoenix.new ecto_models_sample
>cd ecto_models_sample
>mix phoenix.server
>ctrl+c
準備良し。
以降、この記事でのプロジェクトと言えば、
“ecto_models_sample”を指し示す。

目次

  1. コードの自動生成
  2. 生成したモデル見る

1. コードの自動生成

コマンドはこちらにまとめてます。
[Phoenix]PhoenixとEctoのコマンドまとめ
以下のコマンドを実行して生成します。
>mix phoenix.gen.html User users name:string email:string
* creating priv/repo/migrations/20150628044017_create_user.exs
* creating web/models/user.ex
* creating test/models/user_test.exs
* creating web/controllers/user_controller.ex
* creating web/templates/user/edit.html.eex
* creating web/templates/user/form.html.eex
* creating web/templates/user/index.html.eex
* creating web/templates/user/new.html.eex
* creating web/templates/user/show.html.eex
* creating web/views/user_view.ex
* creating test/controllers/user_controller_test.exs

Add the resource to the proper scope in web/router.ex:

    resources "/users", UserController

and then update your repository by running migrations:

    $ mix ecto.migrate
色々生成されましたね。
生成後の説明に二つ指示が出ています。
  • ルーティングの追加
  • マイグレーションの実施
  • ルーティングの追加
scope "/", EctoModelsSample do
  pipe_through :browser # Use the default browser stack

  get "/", PageController, :index
  resources "/users", UserController
end
  • マイグレーションの実施
>mix ecto.create
Compiled lib/ecto_models_sample.ex
Compiled web/models/user.ex
Compiled web/router.ex
Compiled web/views/page_view.ex
Compiled web/views/layout_view.ex
Compiled lib/ecto_models_sample/endpoint.ex
Compiled web/views/error_view.ex
Compiled web/controllers/page_controller.ex
Compiled web/controllers/user_controller.ex
Compiled web/views/user_view.ex
Generated ecto_models_sample app
The database for EctoModelsSample.Repo has been created.
>mix ecto.migrate
[info] == Running EctoModelsSample.Repo.Migrations.CreateUser.change/0 forward
[info] create table users
[info] == Migrated in 0.2s
マイグレーションファイルのディレクトリ。
ディレクトリ: priv/repo/migrations/
DBを作成していないので最初にcreateしている。
やらないとエラーが出る。また二回createすると既にあるとエラーが出る。

2. 生成したモデルを見る

生成したソースコード(コントローラ)には、既にCRUD操作が記述されている。
こちらを参考にすると基本的な使い方は分かる。
またサーバを起動すると、
一通りのCRUD操作が画面上で実施できる。
こちらも合わせて実施するとより分かりやすいと思う。
実際に使っているところはコントローラを見れば良いので、
モデルモジュールについて少しやりましょう。
web/models/user.ex
defmodule EctoModelsSample.User do
  use EctoModelsSample.Web, :model

  schema "users" do
    field :name, :string
    field :email, :string

    timestamps
  end

  @required_fields ~w(name email)
  @optional_fields ~w()

  @doc """
  Creates a changeset based on the `model` and `params`.

  If `params` are nil, an invalid changeset is returned
  with no validation performed.
  """
  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end
schemaに自分で定義していない項目がありますね。
これは関数で”timestamps/0”となります。
生成時間(inserted_at)と更新時間(updated_at)の二つの項目になります。
(また、DB内にはidの項目が自動で定義されています)
次は以下二つの記述を見ます。
@required_fields: 必須になるフィールドを記述。
@optional_fields: オプションのフィールドを記述。
以下の関数はそのままですね。
def changeset(model, params \\ :empty) do
  model
  |> cast(params, @required_fields, @optional_fields)
end
パラメータを必須とオプションのフィールドに分離しています。
実際に使っている部分を見ればもう少し分かりやすいと思います。

管理人の独り言~

生成とマイグレーション、CRUD操作はこれで問題ないですね。
もっと詳しく見たい場合、本家のガイド見るのが一番です。
次はValidation(検証)の記事上げますね。

参考文献

人気の投稿