elixir - Phoenix Framework 中的可选路由参数

标签 elixir phoenix-framework

我开始自学Phoenix Framework他们的文档非常好。然而,在指定可选路由参数时,我遇到了一个绊脚石。 Phoenix Framework Routing Documentation没有提到这是一项功能,所以我假设开发人员有责任提出解决方案。

我将列出我的用例:

  • 用户访问网站 /page/test , 自定义 Plug然后实现一些代码来查找或分配 locale到连接。
  • 因为没有 :locale路径中的参数,默认值按照我的 中的行使用管道 , 即 plug HelloPhoenix.Plugs.Locale, "en" .
  • 用户访问网站 /fr/page/test ,并且在管道中执行相同的代码,除了时间为 :locale参数存在于路由中,即自定义 Plug ( HelloPhoenix.Plugs.Locale )。

  • 现在从路由的角度来看,如果我不能指定 :locale参数是可选的,我最终得到了两倍的路由数量,例如:
    scope "/", HelloPhoenix do
      use_pipeline :browser
      plug HelloPhoenix.Plugs.Locale, "en"
    
      # Route without locale
      get "/page/:slug", PageController, :show
      # Route with locale
      get "/:locale/page/:slug", PageController, :show
    end
    

    如您所知,如果无法指定可选的路由参数,这可能会很快变得非常艰巨和重复。

    不,我确实有一个解决方法,我会在答案中发布,但我不确定它是否 (a) 正确,以及 (b) 最简单的解决方案,因为我是 Erlang、Elixir 和 Phoenix 的新手(我来自 Ruby 和 PHP OOP 的背景)。

    最佳答案

    你可以有一个简单的插头,如:

    defmodule MyApp.SetLocale do
    
      @locales ~w{en fr}
    
      def init(opts), do: opts
    
      def call(conn, _opts) do
        case conn.path_info do
          [locale | rest] when locale in @locales ->
            %{conn | path_info: rest}
            |> Plug.Conn.assign(:locale, locale)
          _  -> Plug.Conn.assign(conn, :locale, "en")
        end
      end
    end
    

    然后将这个插头放在你的路由器之前的 endpoint.ex
      plug MyApp.SetLocale
      plug MyApp.Router
    end
    

    通过这种方式,您甚至可以在到达路由器之前确信区域设置已经设置。您根本不需要在路由器中提及它。

    如果您输入的区域设置不在 @locales 中,则此技术将返回 404。尽管。

    关于elixir - Phoenix Framework 中的可选路由参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38144877/

    相关文章:

    Elixir ETS key 模式匹配

    elixir - 如何在channelcase phoenix框架测试中清除邮箱

    postgresql - (Postgrex.Error) 错误 58P01 (undefined_file)

    elixir - Phoenix Framework - 如何更新数据库中的记录并使用 PATCH 方法?

    elixir - 构建对自身的 GenServer 调用的正确方法

    elixir - Elixir 函数名称中的问号和 "is_"

    elixir - 无法连接 : ** (Postgrex. 错误)致命(invalid_catalog_name):数据库 "api_example_dev"不存在

    mysql - Elixir 中的 Ecto Migration 究竟是什么?

    elixir - 如何调试eex模板和@变量?

    unit-testing - Elixir /ExUnit : how to test functions with system calls most elegantly?