管道应从原始值开始



我在凤凰应用程序控制器中有以下操作:

  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)

我试图重构,但是我没有找到可以使Credo感到高兴的解决方案。有什么想法解决这个问题?

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

最新更新