Elixir 在Phoenix项目中,我应该在哪里定义helper方法?

Elixir 在Phoenix项目中,我应该在哪里定义helper方法?,elixir,phoenix-framework,Elixir,Phoenix Framework,在Phoenix项目中,我应该在哪里定义helper方法 我想定义像Rails这样的助手方法。 但我想知道应该在哪里定义helper方法 该方法用于模板、视图、模型和控制器。 我在模型中定义了following和import等方法。 是这样吗? 还是应该在视图中定义这些 # web/models/session.ex defmodule UserAuthenticator.Session do alias UserAuthenticator.User @doc """ ret

在Phoenix项目中,我应该在哪里定义helper方法

我想定义像Rails这样的助手方法。 但我想知道应该在哪里定义helper方法

该方法用于模板、视图、模型和控制器。 我在模型中定义了following和import等方法。 是这样吗? 还是应该在视图中定义这些

# 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 #web/models/session.ex defmodule UserAuthenticator.Session do 别名UserAuthenticator.User @“医生” 返回当前登录的用户 """ def当前用户(conn)do id=Plug.Conn.get_会话(Conn,:当前_用户) 如果id为,则do:UserAuthenticator.Repo.get(用户,id) 结束 @“医生” 检查用户是否登录 """ def已登录?(conn)do !!当前用户(conn) 结束 结束
首先没有“您应该在那里定义助手”。长生不老药功能只是功能

但将整个模型导入其他地方听起来不是一个好主意。如果需要在其他模块集中提供一组功能,最常见的方法是将helpers模块声明为:

defmodule Helpers do
  defmacro __using__(_opts) do
    quote do
      def func1, do: func2()
      def func2, do: IO.puts 'yay'
    end
  end
end
在任何需要这些功能的地方使用帮助程序

defmodule A do
  use Helpers

  def check, do: func1()
end
A.check #⇒ 'yay'
更多信息(查看最佳实践。)


另一方面,如果您只想在某个专用位置声明helpers,并且不同的模块需要不同的功能,请仅与explicit
参数一起使用,以防止名称冲突:

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

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

我使用了这里找到的方法——效果很好:我不认为使用
宏在
\u中定义函数是“最常见的方法”。在“最佳实践”一节中,您链接了它,强烈建议您不要使用它。@MikeBuhot我建议您重新阅读最佳实践。它建议不要
quote do:import Self
@mudasobwa谢谢您的回答。>首先没有“您应该在那里定义助手”。长生不老药功能只是功能。我明白。这对我会有帮助的。我在视图中定义模块并将其导入。@mudasobwa:>最后,开发人员还应避免使用\uuuu/1回调在\uu中定义函数,除非这些函数是先前定义的
@callback
的默认实现,或者是要重写的函数(请参阅可重写的/1)。即使在这些情况下,定义函数也应该被视为“最后手段”。长生不老药强调:“显式优于隐式。清晰的代码优于简洁的代码”意味着宏应该被用作最后手段。