我在一个基于某些逻辑的控制器中有一个"halt/1“,而不是在一个插头中。遗憾的是,它确实进行了重定向,但也会在重定向之后运行代码。
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我真的需要在重定向后终止呼叫,有什么想法吗?
发布于 2016-07-26 20:35:23
Elixir中没有return -您不能提前退出函数。如果需要,那么重构您的if,使所有不需要执行的语句都在else分支中。
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之后有任何东西,那么它将被执行,而不管采用哪个分支,并且该东西的结果将从操作中返回-可能不是您想要的结果。
发布于 2016-07-26 21:02:10
没有halt/0。您实际上是在调用Plug.Conn.halt/1 (请注意,您正在使用管道运算符(|>)传入变量conn,我假设该变量与%Plug.Conn{}匹配)。
Plug.Conn.halt/1只会阻止跟随当前插件的插件执行(请记住,控制器方法最终也只是插件,并且插件始终是可组合的)。
您应该对此进行重构,以便在语句不成立时希望发生的所有操作都在else块中。
https://stackoverflow.com/questions/38589801
复制相似问题