【问题标题】: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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案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? 以获得更详细的说明。

    【讨论】:

    • 这解决了我的问题,我想知道为什么我没有考虑到这一点。谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2014-06-17
    • 2012-02-26
    • 2012-09-19
    • 2012-06-20
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多