我有一个控制器,我想添加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