将Phoenix请求路径与数据库中定义的Route匹配

scr*_*ipt 7 elixir phoenix-framework

当我们发送请求时,我们在conn结构中有当前路径信息.让我们说补丁请求.

["v1", "users", "2"] or "v1/users/2"
Run Code Online (Sandbox Code Playgroud)

我正在根据db中的路径信息为用户授权编写插件.在db中,路径存储如下:

"v1/users/:id"
Run Code Online (Sandbox Code Playgroud)

这是我们从跑步中获得的路径mix phx.routes.我有可能得到"v1/users/:id"而不是"v1/users/2"当前的路径吗?所以我可以将它与db中存储的路径相匹配.

有什么工作吗?

Gab*_*Prá 1

一种非常简单的方法是手动替换路径中关联键的值。

conn结构体中,我们有path_info: ["v1", "users", "2"]path_params: %{"id" => "2"},所以我们可以这样做:

Enum.reduce(conn.path_params, conn.path_info, fn {key, value}, acc ->
  index = Enum.find_index(acc, fn x -> x == value end)
  List.replace_at(acc, index, ":#{key}")
end)
|> Enum.join("/")
Run Code Online (Sandbox Code Playgroud)

输出将是v1/users/:id.

请注意,如果您的参数值与路线的一部分相同(这似乎不太可能发生),则此操作将会失败。另外,如果您有多个可以采用相同值的参数,那么我们将依赖于 中参数的顺序path_params