2017-07-08 45 views
0

我有這樣的代碼在我的控制器:如何簡化`case` iteraction當代碼幾乎是一樣的

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相同。
有什麼辦法可以大大簡化嗎?
有沒有辦法,因爲我們使用鳳凰做模板來生成這些代碼:

<%= 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

有沒有一種方法,大大簡化了這一點?

是的,你可以先作爲一個原子使用動態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 

有沒有辦法,因爲我們使用鳳凰做模板來生成這些代碼:

您可以使用宏,但我會用上面它採用apply/3的代碼。

+0

其中一個詞:FANTASTIC!非常感謝,Dogbert! –