如何在Elixir Phoenix框架中指定URL中的参数格式?



如何在URL中指定特定参数的格式?例如,对于此 URL:my_website.com/users/123我希望 URL 中的user_id参数为整数和正数。

我该怎么做?是通过正则表达式通过web/routes.ex完成的吗?

这在凤凰城的路由器中是不可能的,因为路由器的实现方式 - 它只能匹配具有精确常量字符串的路径段(/之间的文本)、带有常量前缀的字符串或任何字符串。您可以在控制器操作中手动检查它,如下所示:

def show(conn, %{"user_id" => user_id}) do
case Integer.parse(user_id) do
{user_id, ""} when user_id > 0 ->
# user_id is valid positive integer
text(conn, "ok")
_ ->
# user_id was either not an integer or a negative integer
text(conn, "not ok")
end
end

这通常用Plugs完成。根据文档:

模块插头是另一种类型的Plug,它允许我们在模块中定义连接转换。该模块只需要实现两个功能:

  • init/1初始化要传递给 call/2 的任何参数或选项
  • 执行连接转换的call/2。 call/2 只是我们之前看到的一个功能插头
defmodule HelloPhoenix.Plugs.Checker do
import Plug.Conn
@validator ~r|Ad+z|
def init(default), do: default
def call(%Plug.Conn{params: %{"user_id" => user_id}} = conn, _default) do
# ⇓ HERE
unless Regex.match(@validator, user_id), do: raise
assign(conn, :user_id, user_id)
end
end

最新更新