当代码几乎相同时,如何简化`case`迭代

时间:2017-07-08 14:51:12

标签: 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 = 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

除搜索功能中的结尾_pt/es/de/fr外,代码相同 有没有办法大大简化这个?
有没有办法像在Phoenix Templates中使用:

那样生成此代码
<%= 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%>

1 个答案:

答案 0 :(得分:1)

  

有没有办法大大简化这个?

是的,您可以先使用if/2动态生成函数名称作为原子,然后使用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 Templates中使用:

一样

您可以使用宏,但我使用上面使用apply/3的代码。