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

时间:2016-11-25 08:54:59

标签: elixir phoenix-framework

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

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

2 个答案:

答案 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 / 2
  • 的任何参数或选项   执行连接转换的
  • call/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