管道链应该以原始值开始

时间:2017-06-28 18:58:35

标签: elixir phoenix-framework ecto

我在Phoenix app控制器中执行了以下操作:

  def index(conn, params) do
    studios =
      if params["search"] do
        Studio.search(Studio, params["search"])
      else
        Studio
      end
      |> Repo.all
      |> Repo.preload(:address)

    render conn, studios: studios
  end

当我的运行mix credo时,它会返回以下警告:

┃ [F] → Pipe chain should start with a raw value.
┃       lib/tattoo_backend/web/controllers/api/v1/studio_controller.ex:21 #(TattooBackend.Web.API.V1.StudioController.index)

我试图重构,但我没有找到能使信条满意的解决方案。任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

queryable = 
  if params["search"] do
    Studio.search(Studio, params["search"])
  else
    Studio
  end

queryable
|> Repo.all()
|> Repo.preload(:address)

答案 1 :(得分:3)

使用模式匹配:

def index(conn, params) do
  params
  |> search
  |> Repo.all()
  |> Repo.preload(:address)
end

defp search(%{"search" => search}) do
  Studio.search(Studio, search)
end
defp search(_), do: Studio

答案 2 :(得分:1)

if foo do
  bar
else
  baz
end

相当于if(foo, do: bar, else: baz)。了解了这一点后,您就可以了解错误消息的含义:params["search"]应该通过管道传输到if。这应该修复警告:

def index(conn, params) do
  studios =
    params["search"]
    |> if do
      Studio.search(Studio, params["search"])
    else
      Studio
    end
    |> Repo.all
    |> Repo.preload(:address)

  render conn, studios: studios
end