获取 "config variables" 作为静态值的替代方法

Alternative to get "config variables" as static values

我一直在寻找一些静态的全局值,例如,如果某个值为 nil|null 则放置此默认值,例如将默认值 url 放入 link 中,如果没有'在赋值中声明。

示例:

# Create a link with default return if URL not found
 <%= 
     link "Go back",
         to: assigns[:url_back] || Application.get_env(:app_name, :default_values)[:url_back]
 %>

# example of in ./config/config.exs
config :app_name, :default_values,
    url_back: "/index"
defmodule StaticValues do
   def url_back(), do: "/index"
end
# note: I do not know how to import or use in eex...

如果您决定走模块路线,您可以直接调用 EEx 模板中的函数:

 <%= 
     link "Go back",
         to: assigns[:url_back] || StaticValues.url_back()
 %>

或者您甚至可以创建一个默认为静态值的辅助函数:

# You would probably want to rename this module in this case
defmodule StaticValues do
  def get_with_fallback(assigns, key) do
    Map.get(assigns, key, apply(__MODULE__, key, []))
  end

  def url_back, do: "/index"
end

一样使用
 <%= 
     link "Go back",
         to: StaticValues.get_with_fallback(assigns, :url_back)
 %>

如果有赋值,则使用:

iex> StaticValues.get_with_fallback(%{url_back: "/home"}, :url_back)
"/home"

如果没有,则使用回退:

iex> StaticValues.get_with_fallback(%{}, :url_back)
"/index"

虽然 Brett 的回答是完全正确的,但如果您想更 DRY,可能还有另一种方法。

简单地Map.merge/2呈现模板之前的默认值。

assigns =
  :app_name
  |> Application.get_env(:default_values)
  |> Map.new()
  |> Map.merge(assigns)