Альтернатива для получения «переменных конфигурации» в качестве значений c - PullRequest
2 голосов
/ 22 января 2020

Я искал некоторые глобальные значения как stati c, например, если какое-либо значение равно nil | null, укажите это значение по умолчанию, например, например, укажите URL-адрес по умолчанию в ссылке в eex, если в назначениях нет объявления.

Пример:

# 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...

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Хотя ответ Бретта совершенно верен, может быть другой подход, если вы хотите, чтобы было больше DRY.

Просто слабо Map.merge/2 по умолчанию перед отображением шаблона.

assigns =
  :app_name
  |> Application.get_env(:default_values)
  |> Map.new()
  |> Map.merge(assigns)
1 голос
/ 22 января 2020

Если вы решите go маршрут модуля, вы можете просто вызвать функцию в своем шаблоне EEx:

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

Или вы можете даже сделать вспомогательную функцию по умолчанию для состояния c значение:

# 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"
...