首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“‘halt”(Plug.Conn.halt/1)在控制器中重定向后不会停止调用链

“‘halt”(Plug.Conn.halt/1)在控制器中重定向后不会停止调用链
EN

Stack Overflow用户
提问于 2016-07-26 20:22:22
回答 2查看 2.2K关注 0票数 5

我在一个基于某些逻辑的控制器中有一个"halt/1“,而不是在一个插头中。遗憾的是,它确实进行了重定向,但也会在重定向之后运行代码。

代码语言:javascript
复制
if true do
  conn
    |> put_flash(:error, "Sorry, entered wrong")
    |> redirect(to: route_path(conn, :show, model))
    |> halt #this does not work :(
else
   _ #something
end

update_another_model() #this is executed
render(conn, "abc.html", model: model) #even this is executed

我真的需要在重定向后终止呼叫,有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-26 20:35:23

Elixir中没有return -您不能提前退出函数。如果需要,那么重构您的if,使所有不需要执行的语句都在else分支中。

代码语言:javascript
复制
if condtition() do
  conn
    |> put_flash(:error, "Sorry, entered wrong")
    |> redirect(to: route_path(conn, :show, model))
else
  update_another_model()
  render(conn, "abc.html", model: model)
end

如果condition()true,则执行第一个分支并返回redirect的结果(指示重定向的响应)。如果为false,则第二个分支返回render的结果。

还要注意,如果在if之后有任何东西,那么它将被执行,而不管采用哪个分支,并且该东西的结果将从操作中返回-可能不是您想要的结果。

票数 5
EN

Stack Overflow用户

发布于 2016-07-26 21:02:10

没有halt/0。您实际上是在调用Plug.Conn.halt/1 (请注意,您正在使用管道运算符(|>)传入变量conn,我假设该变量与%Plug.Conn{}匹配)。

Plug.Conn.halt/1只会阻止跟随当前插件的插件执行(请记住,控制器方法最终也只是插件,并且插件始终是可组合的)。

您应该对此进行重构,以便在语句不成立时希望发生的所有操作都在else块中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38589801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档