gpt4 book ai didi

elixir - 我应该在 Phoenix 项目中的什么地方定义辅助方法?

转载 作者:行者123 更新时间:2023-12-04 16:08:58 25 4
gpt4 key购买 nike

我应该在 Phoenix 项目中的什么地方定义 helper 方法?

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

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

# web/models/session.exdefmodule 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)  endend

最佳答案

一开始就没有“你应该在那里定义助手”。 Elixir 函数只是函数。

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

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

在任何需要这些功能的地方使用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

关于elixir - 我应该在 Phoenix 项目中的什么地方定义辅助方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46508447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com