如何使路由识别可选前缀参数,如下所示:
/*lang/controller/id
因为lang部分是可选的,如果URL中没有指定,则具有默认值:
/en/posts/1 => lang = en
/fr/posts/1 => lang = fr
/posts/1 => lang = en
- 编辑 *
理想情况下,我希望通过Map一个命名空间来跨多个控制器和动作实现这一点:
map.namespace "*lang" do |lang|
lang.resources :posts
lang.resources :stories
end
6条答案
按热度按时间cs7cruho1#
好吧,我已经解决了这个问题:
默认情况下,在Rails中没有办法做到这一点(至少目前还没有)。
安装插件后,我将以下文件添加到lib目录:
我将这一行添加到routes.rb:
这基本上填充了一个由插件生成的before和after钩子,它 Package 了rails路由。
当一个url被识别,并且在Rails开始对它做任何事情之前,around_recognize方法被调用。这将提取一个代表locale的两个字母的代码,并将其传递到参数中,如果没有指定locale,则默认为'en'。
同样,当生成一个url时,locale参数将被推送到左侧的URL中。
这会给我以下URL和Map:
所有现有的url helper都像以前一样工作,唯一的区别是除非指定了locale,否则它会被保留:
7gyucuyw2#
您可以使用
:defaults
键在路由中定义默认值。尝试以下操作:bpzcxfmw3#
我明白这个老问题,但它可能是有用的。
并且您必须在application controller中添加before filter来定义locale,例如
velaa5lx4#
我猜(现在没有时间测试)这可能有效:
好吧,试过了--至少在Rails 2.1.1上可以工作。所以这很好。但是不能让:defaults的想法工作,这是一个遗憾,因为它更干燥。
hgc7kmma5#
我想你可以使用一个[key] =〉nil来指定一个可选参数。类似于:
8xiog9wr6#
在较新的Rails(3及以上版本)中,您可以使用可选的路径段来执行此操作:
第一步:
圆括号使
:lang
段成为可选的,约束将其限制为de
、en
或空字符串。第二步:
在你的控制器中,你可以从params hash中读取这个段:
第三步:
在执行重定向时有一个小问题:
:lang
段丢失。要修复此覆盖default_url_options
:其他方面:
邮件地址:
如果您的邮件程序生成链接,并且您也希望在那里使用
:lang
前缀,则可以将default_url_options
添加到ApplicationMailer
类中,并从其他地方读取:lang
,例如从用户记录(如果有)或从参数读取默认路由:
如果希望所有生成的路径/url都尽快添加
:lang
段,则可以向路径添加默认值...但恕我直言,这或多或少会破坏整个概念的目的,因为任何生成的路径/URL都会得到一个
:lang
前缀,不管传入路由如何。我发现在控制器中处理所有默认值并将没有
:lang
前缀的路由视为主路由而不仅仅是从属别名更实用。无前缀路由:
有一个小小的警告:当你像上面那样设置路由,然后重定向到一个没有
:lang
路径段的路由时,该值最终会出现在查询参数中:从
/de/posts/1
这样的路由重定向到主路由将导致如下URL:...因为路由器没有路径段可以放入
lang
参数。从好的方面来说,如果你重定向回posts路由,用户将获得原始的传入路由前缀。