重定向后暂停连接

时间:2015-09-17 17:13:58

标签: elixir phoenix-framework

在控制器内部,我检查连接的会话以验证会话是否附加到用户。如果没有,我将其重定向到另一页。

但是如果我在重定向后尝试调用它,则halt会返回错误:

  

Plug.Conn.halt / 1

中没有匹配的函数子句

如果没有halt原始控制器的页面进行渲染并在控制台中打印错误(模板在没有用户的情况下呈现):

  

(退出)引发异常:(UndefinedFunctionError)undefined function: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 个答案:

答案 0 :(得分:4)

编辑在Elixir的主分支上,如果存在参数,编译器将在没有括号的情况下发出警告。

尝试做:

  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?