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

57

我希望在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时,它可以工作。为什么?

我尝试了conn.title,提示找不到该键。但是,当我尝试conn.secret_key_base时,却可以正常运行。为什么呢?

5个回答

76

get_env 函数是 Elixir/Erlang 核心中 Application 模块的一部分。

该函数返回应用环境中特定键的值。根据你的配置,可以使用以下方法访问 title 属性:

Application.get_env(:my, My.Endpoint)[:title]
第三个参数用于在配置键不存在时传递默认值。

42

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


你必须拥有dev.exs、prod.exs和test.exs文件才能获取当前环境配置。 - Sasha Fonseca
8
这个答案是不正确的,至少在我的系统上是这样。tiagohngl给出了正确的命令。 - Cheezmeister
应用程序参数为:my,键为My.Endpoint。因此,这个答案是不正确的。应该检查@tiago-herique-engel的那个答案。 - febeling

19

假设在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] 

6
为了使我的自定义配置与Phoenix和其他模块的配置清晰分离,我使用了以下方法:
config :ace, :config,
  root: Path.dirname(__DIR__),
  title: "Ace"

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

get_env("变量名")

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

1
如果你深入了解,你会发现配置只是一个将配置值添加到关键字列表中的函数,稍后你可以在应用程序中访问它们。 config/2 接受一个键并将其映射到 keyword_list, config/3 接受一个键,并将键与 keyword_list 作为值添加。
由于你正在使用 config/3,它将在 My.Endpoint 下命名空间中的配置起作用,这将起作用:Application.get_env(:my, My.Endpoint, :title)

config/2 在一次调用中添加多个键值对,而 config/3 仅添加一个键值对。第一个应用程序参数始终为 a。Application.get_env 总是获取给定应用程序和键的一个值。第三个参数指定默认值,以防应用程序或键丢失。 - febeling
使用 Application.get_env(:my, My.Endpoint, :title) 是完全错误的。My.Endpoint 总是有值,而 :title 不是一个合适的默认值(澄清 febeling 的评论)。 - iheggie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接