【发布时间】:2016-12-07 11:46:04
【问题描述】:
我有一个控制器,我想将 facebook 页面 ID 和访问令牌添加到我的数据库中,以便我可以代表用户发布。
为此,我需要对 facebook 进行 GET 调用,然后将访问令牌插入到我的数据库中。
这意味着我有一个嵌套的 case 语句,因为有 2 点错误,来自 facebook 调用和插入 repo:
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
这是丑陋的 imo,所以我想知道如果它会停止进一步处理,我是否做了类似守卫的事情:
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 你能提供一个答案/例子吗?我在网上查看了 with 宏,但似乎没有一个示例真正显示了错误是如何处理的。您是否应该将
with的结果分配给某些东西?来自 facebook 的错误格式为{:ok, %{"error" => %{"message" => message }}},而来自 ecto 的错误格式为{:error, reason}。因此它们可以进行模式匹配。但是我不完全确定这应该如何发生。 (我应该在with语句中分支错误吗?我应该分配with语句的结果以供进一步处理吗?) -
在
with内查看带有else块的示例:elixir-lang.org/docs/stable/elixir/…。
标签: nested elixir phoenix-framework