Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 当代码几乎相同时,如何简化'case'操作_Elixir_Phoenix Framework - Fatal编程技术网

Elixir 当代码几乎相同时,如何简化'case'操作

Elixir 当代码几乎相同时,如何简化'case'操作,elixir,phoenix-framework,Elixir,Phoenix Framework,我的控制器中有以下代码: def search(conn, %{"q" => param}) do locale = conn |> get_session(:locale) case locale do "pt" -> searchEmpresas = Skeleton.Customers.Empresa |> Skeleton.Customers.search_pt(param) searchLojas =

我的控制器中有以下代码:

def search(conn, %{"q" => param}) do
    locale = conn |> get_session(:locale)
    case locale do
      "pt" ->
        searchEmpresas = Skeleton.Customers.Empresa |> Skeleton.Customers.search_pt(param)
        searchLojas = Skeleton.Customers.Loja |> Skeleton.Customers.search_pt(param)
        searchEventos = Skeleton.News.Evento |> Skeleton.News.search_pt(param)
      "es" ->
        searchEmpresas = Skeleton.Customers.Empresa |> Skeleton.Customers.search_es(param)
        searchLojas = Skeleton.Customers.Loja |> Skeleton.Customers.search_es(param)
        searchEventos = Skeleton.News.Evento |> Skeleton.News.search_es(param)
      "fr" ->
        searchEmpresas = Skeleton.Customers.Empresa |> Skeleton.Customers.search_fr(param)
        searchLojas = Skeleton.Customers.Loja |> Skeleton.Customers.search_fr(param)
        searchEventos = Skeleton.News.Evento |> Skeleton.News.search_fr(param)
      "de" ->
        searchEmpresas = Skeleton.Customers.Empresa |> Skeleton.Customers.search_de(param)
        searchLojas = Skeleton.Customers.Loja |> Skeleton.Customers.search_de(param)
        searchEventos = Skeleton.News.Evento |> Skeleton.News.search_de(param)
      _ ->
        searchEmpresas = Skeleton.Customers.Empresa |> Skeleton.Customers.search(param)
        searchLojas = Skeleton.Customers.Loja |> Skeleton.Customers.search(param)
        searchEventos = Skeleton.News.Evento |> Skeleton.News.search(param)
    end
    render(conn, "search.html", searchEmpresas: searchEmpresas, searchLojas: searchLojas, searchEventos: searchEventos)
  end
除了搜索功能中的结尾
\u pt/es/de/fr
外,代码相同。
有没有办法大大简化这一过程?
有没有一种方法可以像我们在Phoenix模板中那样使用以下工具生成此代码:

<%= for i <- ["pt", "es", "de", "fr"] do %>
   i ->
        searchEmpresas = Skeleton.Customers.Empresa |> Skeleton.Customers.search_<%=i%>(param)
        searchLojas = Skeleton.Customers.Loja |> Skeleton.Customers.search_<%=i%>(param)
        searchEventos = Skeleton.News.Evento |> Skeleton.News.search_<%=i%>(param)
<%end%>

searchEmpresas=Skeleton.Customers.Empresa |>Skeleton.Customers.search|(参数)
searchLojas=Skeleton.Customers.Loja |>Skeleton.Customers.search|(参数)
searchEventos=Skeleton.News.Evento |>Skeleton.News.search|(参数)
有没有办法大大简化这个过程

是的,您可以首先使用
if/2
动态地将函数名生成为atom,然后使用
apply/3
调用它

def search(conn, %{"q" => param}) do
  locale = conn |> get_session(:locale)
  f = if locale in ~w(pt es fr de), do: :"search_#{locale}", else: :search
  searchEmpresas = apply(Skeleton.Customers, f, [Skeleton.Customers.Empresa, param])
  searchLojas = apply(Skeleton.Customers, f, [Skeleton.Customers.Loja, param])
  searchEventos = apply(Skeleton.News, f, [Skeleton.News.Evento, param])
  render(conn, "search.html", searchEmpresas: searchEmpresas, searchLojas: searchLojas, searchEventos: searchEventos)
end
有没有一种方法可以像我们在Phoenix模板中那样使用以下工具生成此代码:

您可以使用宏来实现这一点,但我会使用上面使用
apply/3
的代码