【问题标题】:Where should I define helper method in Phoenix project?我应该在 Phoenix 项目中在哪里定义辅助方法?
【发布时间】:2018-03-12 12:24:48
【问题描述】:

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

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

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

# web/models/session.ex defmodule UserAuthenticator.Session 做 别名 UserAuthenticator.User @doc """ 返回当前用户登录 """ def current_user(conn) 做 id = Plug.Conn.get_session(conn, :current_user) 如果 id,做:UserAuthenticator.Repo.get(User, id) 结尾 @doc """ 检查用户是否登录 """ def logged_in?(conn) 做 !!current_user(conn) 结尾 结尾

【问题讨论】:

标签: elixir phoenix-framework


【解决方案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

【讨论】:

  • 我不认为在__using__ 宏中定义函数是“最常见的方法”。在您链接的最佳实践部分中,强烈建议不要这样做。
  • @MikeBuhot 我建议您重新阅读最佳实践。它建议不要使用quote do: import Self
  • @mudasobwa 感谢您的回答。 > 首先没有“你应该在那里定义助手”。 Elixir 函数只是函数。我明白。这对我会有帮助。我在视图中定义模块并导入它。
  • @mudasobwa: > 最后,开发人员还应该避免在 __using__/1 回调中定义函数,除非这些函数是先前定义的 @callback 的默认实现或者是要被覆盖的函数(参见defoverridable/1).即使在这些情况下,定义功能也应该被视为“最后的手段”。
  • Elixir 强调:“显式胜于隐式。清晰的代码胜于简洁的代码”意味着应该使用宏作为最后的手段。 elixir-lang.org/getting-started/meta/macros.html
猜你喜欢
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2020-09-13
相关资源
最近更新 更多