我有一個控制器,我想添加Facebook頁面ID和訪問令牌到我的數據庫,以便我可以代表用戶發佈。Phoenix,conn重定向停止所有進一步處理?
爲此,我需要對Facebook進行GET調用,然後使用我必須插入到數據庫中的訪問令牌。
這意味着我有一個嵌套的case語句,因爲有錯誤的2點,來自Facebook的電話,從插入式回購:
case response_from_facebook do
{:ok, token} ->
case Repo.insert(token) do
{:ok, _} -> ... redirect the user
{:error, _} -> ... show an error message
{:error, _} -> redirect and show an error
這是醜陋的,如果我不喜歡的東西一個海事組織所以我想知道後衛是否會停止進一步處理:
token = case response_from_facebook do
{:ok, token} -> token
{error,_ } -> conn |> redirect(to: user_path(conn, :show, user_id))
end
# Does it ever try to insert into the repo if an error occurs?
Repo.update ... etc.
這將使我的代碼清潔理解/閱讀,但我不是,如果重定向將阻止試圖插入我的回購完全肯定。如果這個「警衛」不是一個解決方案,我怎樣才能防止一個多層嵌套的case語句難以閱讀?
'response_from_facebook'是否會返回一個與'Repo.insert'錯誤分開的簡單模式匹配的錯誤(您可以發佈它可以返回的錯誤類型嗎?)?如果是的話,你可以使用新的'with'宏來簡化這段代碼。 – Dogbert
@Dogbert你能提供一個答案/例子嗎?我在網上查看了宏,但似乎沒有任何實例顯示錯誤是如何處理的。你應該把'with'的結果分配給某個東西嗎?來自Facebook的錯誤形式爲{:ok,%{「error」=>%{「message」=> message}}}'而ecto的錯誤形式爲{:error,reason}'。因此它們可以被模式匹配。不過,我不完全確定應該如何發生。 (我應該在'with'語句中分支一個錯誤嗎?我應該將'with'語句的結果分配給進一步處理嗎?) –
在'with'裏面用'else'代碼塊檢查這個例子:http:// elixir-lang.org/docs/stable/elixir/Kernel.SpecialForms.html#with/1。 – Dogbert