【问题标题】:How to read config variable in Phoenix / Elixir?如何在 Phoenix / Elixir 中读取配置变量?
【发布时间】:2016-06-14 00:37:21
【问题描述】:

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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

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

    此函数返回应用环境中特定键的值。 考虑到您的配置,您可以通过以下方式访问 title 属性:

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

    第三个参数用于在配置键不存在时传递一个默认值。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您必须拥有 dev.exs、prod.exs 和 test.exs 文件才能获取当前环境配置。
      • 这个答案不正确,至少在我的系统上是这样。 tiagohngl 给出了正确的咒语。
      • app参数为:my,key为My.Endpoint。所以这个答案是不正确的。应该检查@tiago-herique-engel 的那个
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

          如果您深入了解配置只是一个将配置值添加到关键字列表的函数,然后您可以在您的应用中访问它们

          config/2 获取一个键并将其映射到关键字列表, config/3 接受一个键,并以keyword_list 作为值添加键。

          由于您使用的是config/3,它会将您的配置命名为 My.Endpoint 下,这将起作用 Application.get_env(:my, My.Endpoint, :title)

          【讨论】:

          • config/2 在一次调用中添加多个键值对,而config/3 仅添加一对。总是有一个 as first app 参数。 Application.get_env 总是为给定的键和给定的应用程序获取一个值。第三个参数指定一个默认值,以防应用程序或密钥丢失。
          • 使用Application.get_env(:my, My.Endpoint, :title) 是完全错误的。 My.Endpoint 总是有值,并且 :title 不是一个合适的默认值(澄清 febeling 的评论)
          猜你喜欢
          • 2017-11-14
          • 1970-01-01
          • 1970-01-01
          • 2020-07-18
          • 2022-12-04
          • 1970-01-01
          • 2018-04-02
          • 2014-07-16
          • 2019-11-08
          相关资源
          最近更新 更多