Phoenix 框架中的可选路由参数

2024-02-11

我已经开始自学凤凰框架 http://www.phoenixframework.org/他们的文档非常好。然而,在指定可选路由参数时,我遇到了障碍。这Phoenix 框架路由文档 http://www.phoenixframework.org/docs/routing没有提到这一点,所以我假设开发人员有责任提出解决方案。

我将列出我的用例:

  1. 用户访问网站/page/test, 一个习俗Plug http://www.phoenixframework.org/docs/understanding-plug然后实现一些代码来查找或分配locale到连接。
  2. 既然没有:locale路径中的参数,默认值按照我的行使用pipeline,即plug HelloPhoenix.Plugs.Locale, "en".
  3. 用户访问网站/fr/page/test,并且相同的代码在管道中执行,除了时间:locale参数存在于路线中,自定义插件(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

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

No I 有解决方法吗,我将在答案中发布,但我不确定它是否(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

然后将此插头放在端点.ex 中的路由器之前

  plug MyApp.SetLocale
  plug MyApp.Router
end

这样,您就可以确信在到达路由器之前就已经设置了区域设置。您根本不需要在路由器中提及它。

如果您输入的区域设置不在该区域中,此技术将返回 404@locales though.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Phoenix 框架中的可选路由参数 的相关文章

  • Ecto迁移中如何动态更新字段值?

    我有一个用户表 例如 email username email protected cdn cgi l email protection email protected cdn cgi l email protection email pr
  • Phoenix框架中如何处理关联和嵌套表单?

    Phoenix框架中如何处理关联和嵌套表单 如何创建具有嵌套属性的表单 在控制器和模型中如何处理它 有一个处理 1 1 情况的简单示例 想象一下我们有一个Car and an Engine模型和显然Car有一个Engine 所以有汽车型号的
  • 如何使用 Ecto 的时间戳向现有表添加时间戳?

    Since inserted at and updated at不可能是null这是行不通的 def change do alter table channels do timestamps end end Postgrex Error E
  • 如何将 Elixir 库加载到 iex 中而不将其添加到项目的 mix.exs deps 中?

    我想尝试 Poison json 模块而不创建混合项目 如何安装它并通过导入使其在 iex 中可用 我已经能够将它添加到项目中 然后在进入项目目录并使用 iex S mix 后使用它 tbrowne LILJEN code elixirTr
  • Elixir - 递归列表值的总和

    只是尝试对列表值进行简单求和 defmodule Mth do def sum list do 0 end def sum list H T do H sum list T end end IO puts Mth sum list 1 2
  • 如何调试eex模板和@变量?

    我有这个模板 div class alert alert danger p Oops something went wrong Please check the errors below p div 如何在 IEx 控制台中显示 chang
  • “!”、“?”、“_”和“.”是什么意思? Elixir 中的语法

    我需要帮助理解 Elixir 中的以下语法 and 这些语法在 Elixir 的功能中起什么作用 例如Repo get 我不确定它们是否只是函数名称 或者有一个角色 虽然我知道 用于调用匿名函数 和 对于任何或可变的 失败时引发异常的函数约
  • 套接字无法连接到端点

    var socket new Socket localhost 4000 socket connect Returns WebSocket connection to ws localhost 4000 ws failed Error du
  • 打造 ecto 独一无二的领域

    如何制作一个字段unique在体外 我以为它和Ruby中的活动记录一样 但似乎不是 你想使用唯一约束 3 http hexdocs pm ecto Ecto Changeset html unique constraint 3 这与 Act
  • Ecto 和 Elixir 的默认日期时间

    我今天刚刚开始使用 Elixir 和 Phoenix 我正在尝试添加 Ecto 作为映射器 但我在使用时间时遇到了一些问题 这是我的模型 schema users do field name string field email strin
  • Ecto - 验证关联模型的存在

    如何验证 Ecto 中是否存在关联模型 schema foo do has many bar Bar timestamps end required fields w bar invalid 有办法这样做吗 并验证这些字段的最小 最大数量
  • Elixir 中的递归和匿名函数

    我正在尝试定义一个匿名函数来执行点积 我可以将其编码为私有函数 没有任何问题 但我正在努力解决匿名函数语法 我知道我可以以不同的方式实现这一点 但我试图了解如何使用模式匹配和递归来定义匿名函数 这是我当前的实现 dot fn i input
  • GenServer 正常关闭

    我使用 GenServer 编写了一个 Elixir 应用程序 该应用程序在启动时启动外部应用程序 然后将其关闭 并在退出时进行其他清理 我在中添加了启动功能init 1 https hexdocs pm elixir GenServer
  • 如何在 Elixir 中截断字符串?

    我正在使用长生不老药的鼻涕虫 想法是 我有一个字符串 a zA Z0 9 用连字符分隔的单词 喜欢 string another long string to be truncated and much text here 我想确保最大字符
  • Elixir:当 Phoenix 控制器需要数据库中的记录时,如何测试它们?用种子还是模拟?

    测试控制器时 在测试数据库中保存一些数据可能会很有用 有时您可能想测试数据创建 设置这个的正确方法是什么 对控制器的测试应该测试是否create控制器的功能正在工作 而不是模型 作为一个例子 我想测试一个会话控制器 我有两个测试 一是测试创
  • Elixir 如何将 Map 结构转换为 Record 结构

    我有一个 Record 结构和一个 Map 结构 例如 defmodule Foo Bar do defstruct boo nil baz nil end defmodule Foo do require Record Record de
  • 使用 gitbash 和 elixir 在 vscode 中输出垃圾而不是颜色

    我开始学习elixir并成功让iex有ansi颜色 问题是在 vscode 的终端中 输出看起来像垃圾 iex Interactive Elixir 1 8 1 press Ctrl C to exit type h ENTER for h
  • 让 Ecto 查询更高效

    我正在尝试查看当前用户的团队是否与传入的用户团队重叠 我有一些有用的东西 但我很好奇它是否能让我更有效率 这是我所拥有的 user teams from t in MyApp Team left join a in assoc t acco
  • Elixir - 尝试/捕获 vs 尝试/救援?

    背景 Both try rescue and try catch是 Elixir 中的错误处理技术 根据相应章节 http elixir lang org getting started try catch and rescue html在
  • 如何获得 Elixir 中每种类型的最小值和最大值

    如何获得 Elixir 中每种类型的最小值和最大值 例如整数 浮点数和字符串的最大可能长度 我知道在C中它的定义是limits h as INT MIN INT MAX等等 关于 Elixir 中这些类型的限制的文档在哪里 Elixir 实

随机推荐