9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Phoenix APIのDBアクセッサ/バリデータのコード解析

Last updated at Posted at 2018-06-19

(この記事は、「サーバーサイドプログラミング Advent Calendar 2017」の3日目です)


fukuoka.ex代表のpiacereです
ご覧いただいて、ありがとうございます :bow:

今回は、前回の続きで、Phoenixで自動生成したAPIの、DBアクセッサ/バリデータについて、コード解析します


:stars::stars::stars::stars::stars: お知らせ:Elixir MeetUpを6月末に開催します :stars::stars::stars::stars::stars:

「fukuoka.ex#11:DB/データサイエンスにコネクトするElixir」を6/22(金)19時に開催します

image.png

fukuoka.exの発足から、ちょうど1周年となる、記念的なイベントでもあるため、このコラムを気に入っていただいた方と、ぜひ一緒に盛り上がりたいです

福岡近辺にお住まいの方であれば、遊びに来てください

大人気により、一度は満席となりましたが、増枠しましたので、下記URLよりご参加ください
https://fukuokaex.connpass.com/event/87241

特別ゲストは、Erlang/Elixirの両面で世界的に有名な「力武 健次さん」と、北九州の飯塚市で「e-ZUKA Tech Night」を6年間主催し続けるハウインターナショナルの「谷口 耕平さん」のお二人と、実に豪華なイベントです

私は、今回のシリーズを踏まえた、「1家に1台、パーソナルなデータ分析AIを全員が持つ2020年を作る」というタイトルで、Elixirによる、ブラウザUI上からサクっとデータ分析プラットフォームを披露するLTをお届けします

DBアクセッサとバリデータ

APIのリクエスト/レスポンスの解析/改造は、前回までの内容だけで充分やっていけるのですが、ついでに、DBアクセッサとバリデータについても把握しておいた方が、Phoenixの理解は進むので、ついでに解説しておきます

DBアクセッサは、下記モジュール(≒mix phx.gen.jsonで第1引数に指定した名前で作られる)に集約されています

list_sample()がコントローラのindex()から呼ばれ、create_sample()がコントローラのcreate()から呼ばれます

このモジュール内容は、APIだけで無く、「mix phx.gen.html~」で自動生成するWebのときも、同じ内容で生成されます

lib/sample_analytics/api/api.ex
defmodule SampleAnalytics.Api do

  def list_sample do
    Repo.all(Sample)
  end
 …
  def create_sample(attrs \\ %{}) do
    %Sample{}
    |> Sample.changeset(attrs)
    |> Repo.insert()
  end

バリデータは、下記モジュールのchangeset()として生成されます

changeset()は、上記DBアクセッサモジュールのcreate_sample()やupdate_sample()から、DBデータ更新(≒Repo.insert()やRepo.update())直前に呼ばれます

このモジュール内容も、「mix phx.gen.html~」で自動生成するWebのときと同じですし、DBアクセッサにてDBデータ更新直前にchangeset()が呼ばれる点も同じです

lib/sample_analytics/api/sample.ex
defmodule SampleAnalytics.Api.Sample do
  use Ecto.Schema
  import Ecto.Changeset

  schema "sample" do
    field :body, :string
    field :title, :string

    timestamps()
  end

  @doc false
  def changeset(sample, attrs) do
    sample
    |> cast(attrs, [:title, :body])
    |> validate_required([:title, :body])
  end
end

なお、changeset()内で呼べるバリデーション処理については、「elixir on phoenix changesetでのValidates」をご覧いただくと参考になると思います

終わり

今回は、Phoenix APIのDBアクセッサ/バリデータのコードの流れを解析しました

DBアクセッサをいじる機会は、そこまでは無いと思いますが、一方でバリデータは、比較的カスタマイズする機会がありますので、キャッチアップしておくと、Phoenix API開発がスムースになるかと思います

p.s.「いいね」よろしくお願いします

よろしければ、ページ左上の image.pngimage.png のクリックをお願いしますー:bow:

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?