【问题标题】:How to simplify `case` iteraction when the code is almost the same当代码几乎相同时如何简化`case`迭代
【发布时间】:2017-07-08 23:05:41
【问题描述】:

我的控制器中有这段代码:

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 模板中那样使用:

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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案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 模板中那样使用:

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

    【讨论】:

      猜你喜欢
      • 2022-07-11
      • 2023-03-27
      • 1970-01-01
      • 2012-02-20
      • 2019-02-13
      • 1970-01-01
      • 2011-03-26
      • 2017-03-15
      • 2013-05-14
      相关资源
      最近更新 更多