重定向后停止连接
Posted
技术标签:
【中文标题】重定向后停止连接【英文标题】:Halt a connection after a redirect 【发布时间】:2015-09-17 17:13:58 【问题描述】:在控制器内部,我正在检查连接的会话以验证会话是否附加到用户。如果没有,我将其重定向到其他页面。
但是如果我在重定向后尝试调用 halt
会返回一个错误:
Plug.Conn.halt/1 中没有函数子句匹配
如果没有halt
,原始控制器的页面会在控制台中渲染并打印错误(模板是在没有用户的情况下渲染的):
(退出)引发异常:(UndefinedFunctionError)未定义函数:nil.username/0
所以我的问题是:重定向后是否可以调用halt
?
这是我的控制器的代码和其中使用的模块。
defmodule Mccm.DashboardController do
use Mccm.Web, :controller
import Mccm.Plug.Session
import Mccm.Session, only: [current_user: 1]
plug :needs_to_be_logged_in
def index(conn, _params) do
conn
|> render "index.html", user: current_user(conn)
end
end
defmodule Mccm.Plug.Session do
import Mccm.Session, only: [logged_in?: 1, is_teacher?: 1]
import Phoenix.Controller, only: [redirect: 2]
import Plug.Conn, only: [halt: 1]
def needs_to_be_logged_in(conn, _) do
if !logged_in?(conn) do
conn
|> redirect to: "/"
|> halt # this give me an error
else
conn
end
end
end
这里使用的依赖项:
凤凰:1.0.2 phoenix_ecto:1.1 phoenix_html: 2.1 牛仔:1.0【问题讨论】:
【参考方案1】:EDIT 在 Elixir 的 master 分支上,如果有参数,编译器会警告如果一个函数被不带括号的管道输入。
尝试做:
def needs_to_be_logged_in(conn, _) do
if !logged_in?(conn) do
conn
|> redirect(to: "/") # notice the brackets
|> halt # this give me an error
else
conn
end
end
你的代码在做什么:
|> redirect(to: "/", |> halt)
并且错误正确地识别出没有模式:
halt(to: "/")
请参阅Why Can't I Chain String.replace? 以获得更详细的说明。
【讨论】:
这解决了我的问题,我想知道为什么我没有考虑到这一点。谢谢你的回答!以上是关于重定向后停止连接的主要内容,如果未能解决你的问题,请参考以下文章