【问题标题】:Programming Phoenix: undefined function page_path/2凤凰编程:未定义函数page_path/2
【发布时间】:2019-09-23 01:14:49
【问题描述】:

我的网络应用出现问题,出现以下编译错误:

== Compilation error on file web/controllers/auth.ex ==
** (CompileError) web/controllers/auth.ex:49: undefined function page_path/2
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1

我知道大多数问题都与router.ex 上的路线丢失有关,但这里似乎没有任何问题:

  scope "/", Rumbl do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
    get "/users/:id", UserController, :show
    resources "/users", UserController, only: [:index, :show, :new, :create]
    resources "/sessions", SessionController, only: [:new, :create, :delete]
    resources "/videos", VideoController

  end

  scope "/manage", Rumbl do
    pipe_through [:browser, :authenticate_user]

    resources "/videos", VideoController
  end

我的 web.ex 看起来像这样:

def router do
  quote do
    use Phoenix.Router
    import Rumbl.Auth, only: [authenticate_user: 2] # New import
  end
end

def controller do
  quote do
    use Phoenix.Controller

    alias Rumbl.Repo
    import Ecto
    import Ecto.Query, only: [from: 1, from: 2]

    import Rumbl.Router.Helpers
    import Rumbl.Gettext
    import Rumbl.Auth, only: [authenticate_user: 2] # New import

  end
end

auth.ex 看起来像这样

defmodule Rumbl.Auth do
  import Plug.Conn
  import Comeonin.Bcrypt, only: [checkpw: 2, dummy_checkpw: 0]
  import Phoenix.Controller
  alias Rumbl.Router.Helpers

  def init(opts) do
    Keyword.fetch!(opts, :repo)
  end

  def call(conn, repo) do
    user_id = get_session(conn, :user_id)
    user = user_id && repo.get(Rumbl.User, user_id)
    assign(conn, :current_user, user)
  end

  def login_by_username_and_pass(conn, username, given_pass, opts) do
    repo = Keyword.fetch!(opts, :repo)
    user = repo.get_by(Rumbl.User, username: username)

    cond do
      user && checkpw(given_pass, user.password_hash) ->
        {:ok, login(conn, user)}
      user ->
        {:error, :unauthorized, conn}
      true ->
        dummy_checkpw()
        {:error, :not_found, conn}
    end
  end

  def login(conn, user) do
    conn
    |> assign(:current_user, user)
    |> put_session(:user_id, user.id)
    |> configure_session(renew: true)
  end

  def logout(conn) do
    configure_session(conn, drop: true)
  end

  def authenticate_user(conn, _opts) do
    if conn.assigns.current_user do
      conn
    else
      conn
      |> put_flash(:error, "You must be logged in to access that page")
      |> redirect(to: page_path(conn, :index))
      |> halt()
    end
  end
end

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    在 phoenix 1.4 中,您需要使用模块名称调用函数

    Routes.page_path(@conn, :create)
    

    【讨论】:

    • 谢谢。查看一些较旧的教程,这解决了问题欢呼:)
    • 谢谢,也适用于“topic_path”|> redirect(to: Routes.topic_path(conn, :index))。
    【解决方案2】:

    你能发布 auth.ex 文件吗?第 49 行似乎有问题。

    解决办法:

    请更改此行:

    |> redirect(to: page_path(conn, :index))
    

    到

    |> redirect(to: Helpers.page_path(conn, :index))
    

    【讨论】:

    • 我已经在上面添加了。
    • 请将此行|> redirect(to: page_path(conn, :index))改为|> redirect(to: Helpers.page_path(conn, :index))
    • 这个错误来自生成的文件。为什么会这样?
    • 是因为Router Helpers Alias
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2016-01-30
    • 2016-05-03
    相关资源
    最近更新 更多