如何指定网址中某些参数的格式?例如,对于此URL:my_website.com/users/123
我希望URL中的user_id
参数为整数且为正数。
我该怎么做?是通过正则表达式通过web/routes.ex
完成的吗?
答案 0 :(得分:4)
由于路由器的实现方式,这在凤凰城的路由器中是不可能的 - 它只能匹配路径段(/
之间的文本)与精确的常量字符串,带有常量前缀的字符串或任何字符串。您可以在控制器操作中手动检查它,如下所示:
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
答案 1 :(得分:2)
通常使用Plug
来完成。根据文件:
模块插件是另一种
Plug
,它允许我们在模块中定义连接转换。该模块只需要实现两个功能:
- 的任何参数或选项 执行连接转换的
init/1
初始化要传递给call / 2call/2
。 call / 2只是我们之前看到的功能插件
defmodule HelloPhoenix.Plugs.Checker do
import Plug.Conn
@validator ~r|\A\d+\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