目的
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
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”を指し示す。
以降、この記事でのプロジェクトと言えば、
“ecto_models_sample”を指し示す。
目次
- コードの自動生成
- 生成したモデル見る
1. コードの自動生成
コマンドはこちらにまとめてます。
[Phoenix]PhoenixとEctoのコマンドまとめ
[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/
ディレクトリ: priv/repo/migrations/
DBを作成していないので最初にcreateしている。
やらないとエラーが出る。また二回createすると既にあるとエラーが出る。
やらないとエラーが出る。また二回createすると既にあるとエラーが出る。
2. 生成したモデルを見る
生成したソースコード(コントローラ)には、既にCRUD操作が記述されている。
こちらを参考にすると基本的な使い方は分かる。
こちらを参考にすると基本的な使い方は分かる。
またサーバを起動すると、
一通りの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の項目が自動で定義されています)
これは関数で”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(検証)の記事上げますね。