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

如何在Elixir Phoenix框架中指定URL中参数的格式?,elixir,phoenix-framework,Elixir,Phoenix Framework,如何在URL中指定特定参数的格式?例如,对于此URL:my_website.com/users/123我希望URL中的user\u id参数为整数和正 我该怎么做?它是通过正则表达式通过web/routes.ex完成的吗?这在凤凰城的路由器中是不可能的,因为路由器的实现方式——它只能将路径段(介于/之间的文本)与精确的常量字符串、带有常量前缀的字符串或任何字符串匹配。您可以在控制器操作中手动检查它,如下所示: def show(conn, %{"user_id" => user_id})

如何在URL中指定特定参数的格式?例如,对于此URL:
my_website.com/users/123
我希望URL中的
user\u 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

这通常是用s。根据文件:

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

  • init/1
    初始化要传递给call/2的任何参数或选项
  • call/2
    执行连接转换。call/2只是我们前面看到的一个函数插件

“你能做的最好的事情就是在你的
控制器中处理这个问题”-这是一个有点错误的建议<代码>插头
s就是为此而发明的。@mudasobwa你说得对。我已经调低了语言。如果“user\u id”是一个整数呢?问题是,我们不知道它是整数、字符串还是“fdsfdsfdsfd”。Integer.parse只接受字符串。@Kurama您是否将使用包含整数值的“user\u id”直接调用此函数?Phoenix将以字符串形式传递所有参数(除非您有一个修改原始值的插件)。请注意,这不会退回到匹配其余路由,就像希望在路由中进行正则表达式匹配的人在不匹配的情况下所期望的那样(与我的答案相同,但对于Phoenix新手来说可能不太明显)。我相信
raise
默认情况下也会导致5xx的响应。注意@Dogbert上面的评论有附加值,请阅读。另外,请注意,我在那里使用了
raise
作为伪代码存根/示例。如何在相应的
管道中指定应将
hellophenix.Plugs.Checker
应用于哪个控制器和操作。检查我链接的
Plug
文档。如果我只想将其应用于单个操作,该怎么办?
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