我开始自学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/