Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Yohei Tanimoto
PPTX, PDF
1,569 views
For tokyo.ex #2 LT
To explain tips and tricks regarding Phoenix framework (excerpting from an article of Chris McCord)
Technology
◦
Read more
0
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 12
2
/ 12
3
/ 12
4
/ 12
5
/ 12
6
/ 12
7
/ 12
8
/ 12
9
/ 12
10
/ 12
11
/ 12
12
/ 12
More Related Content
PDF
【サポーターズCoLab勉強会】「美少女になりたい…」お手軽VTuber入門ハンズオン
by
Kohki Nakaji
PDF
Javaで最強のfizz buzz
by
yy yank
PPTX
azure障害は忘れたころにやってくる
by
裕之 木下
PPTX
VagrantでAzureを使ってみた話
by
Yuta Matsumura
PPT
maven2+aptで楽々ドキュメント
by
Yoichiro Tanaka
PDF
Shibuya trac8
by
riskrisk
PDF
さくらのクラウドAPIをsacloudつかってさわってみた
by
Tak Nishikori
PDF
my unite plugins
by
basyura
【サポーターズCoLab勉強会】「美少女になりたい…」お手軽VTuber入門ハンズオン
by
Kohki Nakaji
Javaで最強のfizz buzz
by
yy yank
azure障害は忘れたころにやってくる
by
裕之 木下
VagrantでAzureを使ってみた話
by
Yuta Matsumura
maven2+aptで楽々ドキュメント
by
Yoichiro Tanaka
Shibuya trac8
by
riskrisk
さくらのクラウドAPIをsacloudつかってさわってみた
by
Tak Nishikori
my unite plugins
by
basyura
What's hot
PDF
擬似乱数生成器の評価
by
Taku Miyakawa
PDF
100GbE NICを使ったデータセンター・ネットワーク実証実験 -メモ-
by
Naoto MATSUMOTO
PDF
さくらのクラウドでUCARPを使う方法 -メモ-
by
Naoto MATSUMOTO
PDF
A_road_to_AMBER_simulations_ver_1.0
by
Satoshi Kume
PPTX
「おりこうさんな秘書」に使われている技術・手法について
by
YSRKEN
PDF
Vagrant intro
by
t9md
PPTX
Microsoft open technologies の ross gardler さんを囲む会 改め 『microsoft open technolo...
by
Kazumi Hirose
PPTX
MS open technologies の ross gardler さんを囲む会 改め 『MS open technologies に必ず伝えてほしい...
by
Kazumi Hirose
擬似乱数生成器の評価
by
Taku Miyakawa
100GbE NICを使ったデータセンター・ネットワーク実証実験 -メモ-
by
Naoto MATSUMOTO
さくらのクラウドでUCARPを使う方法 -メモ-
by
Naoto MATSUMOTO
A_road_to_AMBER_simulations_ver_1.0
by
Satoshi Kume
「おりこうさんな秘書」に使われている技術・手法について
by
YSRKEN
Vagrant intro
by
t9md
Microsoft open technologies の ross gardler さんを囲む会 改め 『microsoft open technolo...
by
Kazumi Hirose
MS open technologies の ross gardler さんを囲む会 改め 『MS open technologies に必ず伝えてほしい...
by
Kazumi Hirose
For tokyo.ex #2 LT
1.
5/23(月) tokyo.ex #2 LT @yohei_tanimoto
2.
Phoenix Tips and
Tricks • 5/2(月)にChris McCordが、「Phoenixに関してこういうところに 注意すると良いよ」という主旨のブログを出した • 内容は以下の3つ 1. コントローラ内でaction/2をオーバーライドする 2. ErrorViewはコントローラで直接レンダリングする 3. Task.awaitする必要がなければ、Task.asyncを使わない
3.
本題の前に、Phoenixの処理 の流れをおさらい かなりざっくりと… connection |> endpoint |> router |>
pipelines |> controller 詳細な足回りについては、古城さんの前回の発表資料を参考 https://speakerdeck.com/hidetakakojo/tokyo-dot-ex-number-1- phoenixframeworkfalsezu-hui-ri 既存のPlugモジュールについては、菅原さんの前々回の発表資料を参考 http://sssslide.com/speakerdeck.com/winebarrel/elixir-meetup-number-2- plugfalsemoziyuruwo-tong-rishi-tutemita
4.
本題の前に、Phoenixの処理 の流れをおさらい Controllerのところをもう少し詳しく connection |> controller |> common_services |>
action
5.
コントローラ内でaction/2を オーバーライドする 以下の例、post_controller.ex内の「 conn.assigns.current_userへの繰り返しアクセス」があ まりイケてない。current_user(conn)を使っても、不必要な MAPへのアクセスが増えてベストではない。 defmodule MyApp.PostController do use
MyApp.Web, :controller def show(conn, %{"id" => id}) do {:ok, post} = Blog.get_post_for_user(conn.assigns.current_user, id) render(conn, "show.html", owner: conn.assigns.current_user, post: post) end def create(conn, %{"post" => post_params}) do {:ok, post} = Blog.publish_post(conn.assigns.current_user, post_params) redirect(conn, to: user_post_path(conn, conn.assigns.current_user, post) end end
6.
コントローラ内でaction/2を オーバーライドする 以下のように action/2をオーバーライド defmodule MyApp.PostController
do use MyApp.Web, :controller def action(conn, _) do args = [conn, conn.params, conn.assigns[:current_user] || :guest] apply(__MODULE__, action_name(conn), args) end def show(conn, %{"id" => id}, current_user) do {:ok, post} = Blog.get_post_for_user(current_user, id) render(conn, "show.html", owner: current_user, post: post) end def create(conn, %{"post" => post_params}, current_user) do {:ok, post} = Blog.publish_post(current_user, post_params) redirect(conn, to: user_post_path(conn, current_user, post) end end
7.
コントローラ内でaction/2を オーバーライドする 複数のコントローラで呼び出したい場合は、以下のようにしてお けば、use MyApp.Controllerでオーバーライド済み actionを簡単に使える defmodule MyApp.Controller
do defmacro __using__(_) do quote do def action(conn, _), do: MyApp.Controller.__action__(__MODULE__, conn) defoverridable action: 2 end end def __action__(controller, conn) do args = [conn, conn.params, conn.assigns[:current_user] || :guest] apply(controller, Phoenix.Controller.action_name(conn), args) end end
8.
モジュール内で関数をCallす るには • 該当モジュール内の def
または defp で定義 • import宣言により、他のモジュールからインポート • use宣言により、該当モジュール内のdef か defp か import か use か @before_compile に展開 • 該当モジュール内の @before_compile 属性で指定したマク ロが def か defp か import か use に展開
9.
ErrorViewはコントローラで 直接レンダリングする with/elseを使えば、ステータスコードに応じて、テンプレートで はなく、コントローラ内でエラー画面を出し分けられる(よくあるの は、「Ecto.NoResultsError」を "404.html"テンプレート で、 「Phoenix.ActionClauseError」を
“400.html"テ ンプレートで 等) def create(conn, %{"post" => post_params}, current_user) do with {:ok, post} <- Blog.publish_post(current_user, post_params) do redirect(conn, to: user_post_path(conn, current_user, post) else {:error, %Ecto.Changeset{} = changeset} -> render(conn, "edit.html", changeset: changeset) {:error, :unauthorized} -> conn |> put_status(401) |> render(ErrorView, :"401", message: "You are not authorized to publish posts") {:error, :rate_limited} -> conn |> put_status(429) |> render(ErrorView, :"429", message: "You have exceeded the max allowed posts for today") end end
10.
Task.awaitする必要がなけれ ば、Task.asyncを使わない 以下はOKパターン def create(conn, %{"access_code"
=> code}) do facebook = Task.async(fn -> Facebook.get_token(code) end) twitter = Task.async(fn -> Twitter.get_token(code) end) render(conn, "create.json", facebook: Task.await(facebook), twitter: Task.await(twitter)) end
11.
Task.awaitする必要がなけれ ば、Task.asyncを使わない 以下がNGパターン def delete(conn, _,
current_user) do {:ok, user} = Accounts.cancel_account(current_user) Task.async(fn -> Audits.alert_cancellation_notice(user) end) conn |> signout() |> put_flash(:info, "So sorry to see you go!") |> redirect(to: "/") end TaskのCallerとTaskがリンクされているので、両側における異常 終了が双方に影響する。クライアントは、アカウントが削除された直後 に500エラーを受け取り、きちんとオペレーションが成功したかどうか が分からないなど、問題がある
12.
Task.awaitする必要がなけれ ば、Task.asyncを使わない 以下のようにタスクをコントローラ(TaskのCaller)から切り離 し、スーパーバイザにオフロードすれば、問題解決 def delete(conn, _,
current_user) do {:ok, user} = Accounts.cancel_account(current_user) Task.Supervisor.async_nolink(MyApp.TaskSupervisor, fn -> Audits.alert_cancellation_notice(user) end) end) conn |> signout() |> put_flash(:info, "So sorry to see you go!") |> redirect(to: "/") end
Download