1 min read

no matching action clause to process request

本文基于 phoenix framework 1.1.4。

我在 phoenix 项目里,定义了这样一个函数,用来过滤用户:

  def index(conn, %{"email" => email, "codename" => codename}) do
    # ... get the user with the filters
  end

访问以下两个路径:

  1. http://localhost:4000/api/users?codename=Plator
  2. http://localhost:4000/api/users?email=chenxsan@example.com

均会报告以下错误:

Phoenix.ActionClauseError at GET /api/users

bad request to IngressRun.UserController.index, no matching action clause to process request

但如果访问

http://localhost:4000/api/users?email=chenxsan@example.com&codename=Plator

却是能正常响应的。

这篇的意思,我有多少个过滤条件,过滤条件组合一下,我就要定义多少个 action – 并不现实,也很傻。

比较靠谱的做法是这一篇。不过它的示例里:

Post
|> where(^filters)
|> Repo.all

在我的测试中,会报一个编译错误:

cannot use ^filters outside of match clauses

换成以下形式就没问题:

from(p in Post, where: ^filters) |> Repo.all

另外我好奇的是,为什么这种过滤资源的常用功能,许多框架都不集成,phoenix 里我没见到,express.js 里也没有。

报告问题 修订

如果你有自建 https 代理的需求,欢迎尝试 Phantom,一键搭建,方便快捷。查看 demo