管道链应该以原始值开始

Pipe chain should start with a raw value

我的 Phoenix 应用程序控制器中有以下操作:

  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 它 returns 以下警告:

┃ [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)

我试图重构它,但没有找到让 credo 满意的解决方案。有什么解决办法吗?

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
queryable = 
  if params["search"] do
    Studio.search(Studio, params["search"])
  else
    Studio
  end

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

使用模式匹配:

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