我应该在Phoenix项目中定义哪个辅助方法?

时间:2017-10-01 01:28:47

标签: elixir phoenix-framework

我应该在Phoenix项目中定义哪个辅助方法?

我想定义像Rails这样的辅助方法。 但我想知道在哪里定义辅助方法。

该方法用于模板,视图,模型和控制器。 我在模型中定义了如下的方法,并在web.ex中导入。 这样对吗? 或者我应该在视图中定义这些?


# web/models/session.ex

defmodule UserAuthenticator.Session do
  alias UserAuthenticator.User

  @doc """
    return current user logged in
  """
  def current_user(conn) do
    id = Plug.Conn.get_session(conn, :current_user)
    if id, do: UserAuthenticator.Repo.get(User, id)
  end

  @doc """
   check whether user login in
  """
  def logged_in?(conn) do
    !!current_user(conn)
  end
end

1 个答案:

答案 0 :(得分:1)

首先没有“你应该在那里定义帮助 ”。 Elixir函数只是函数。

但是将整个模型导入其他地方并不是一个好主意。如果您需要在其他模块集中提供一组函数,最常见的方法是将辅助模块声明为:

defmodule Helpers do
  defmacro __using__(_opts) do
    quote do
      def func1, do: func2()
      def func2, do: IO.puts 'yay'
    end
  end
end

use Helpers您需要这些功能:

defmodule A do
  use Helpers

  def check, do: func1()
end
A.check #⇒ 'yay'

有关Kernel.use/2的更多信息(请查看最佳做法。)

另一方面,如果您只想在某个专用位置声明帮助器并且不同的模块应该需要不同的功能,请使用Kernel.SpecialForms.import/2 和明确的only参数防止名称冲突:

defmodule Helper do
  def func1, do: IO.puts '1'
  def func2, do: IO.puts '2'
end

defmodule M1 do
  import Helper, only: [:func1]
end