如何读取 Phoenix / Elixir 中的配置变量?

How to read config variable in Phoenix / Elixir?

我想在 my/config/config.exs 文件中设置我的应用程序的标题:

config :my, My.Endpoint,
  url: [host: "localhost"],
  root: Path.dirname(__DIR__),
  secret_key_base: "secret",
  title: "My App"

我如何阅读 title 之后才能在模板中使用它?类似于:

<div>
  Title of my app is <%= ??? %>
</div>

我试了conn.title,它说没有这样的密钥。但是,当我尝试 conn.secret_key_base 时,它起作用了。为什么?

您可以使用Application.get_env(:my, :title)

如果你深入了解配置是如何将配置值添加到关键字列表的函数,稍后你可以在你的应用程序中访问它们

config/2 取一个键并将其映射到 keyword_list, config/3 取一个键并添加键 keyword_list 作为值。

由于您使用的是 config/3,因此它会在 My.Endpoint 下命名您的配置,这将有效 Application.get_env(:my, My.Endpoint, :title)

get_env 函数是 Elixir/Erlang 核心的应用程序模块的一部分。

此函数 returns 应用程序环境中特定键的值。 考虑到您的配置,您可以这样访问 title 属性:

Application.get_env(:my, My.Endpoint)[:title]

第三个参数是当config key不存在时传递一个默认值

为了明确区分我的自定义配置和 phoenix 的配置以及我使用的其他模块:

config :ace, :config,
  root: Path.dirname(__DIR__),
  title: "Ace"

然后您使用 get_env 调用检索值,例如:

iex> Application.get_env(:ace, :config)[:title]
"Ace" 

假设在 dev.ex 文件中你有一个配置变量

config :app_name, AppName.Endpoint,
  api_prefix: "api/v2",
  api_host: "http://0.0.0.0",
  api_port: "3000"

您可以获取所有三个配置变量

Application.get_env(:app_name, AppName.Endpoint)[:api_prefix]
Application.get_env(:app_name, AppName.Endpoint)[:api_host]
Application.get_env(:app_name, AppName.Endpoint)[:api_port]