ruby-on-rails - 使用可选路径前缀创建路由

标签 ruby-on-rails ruby routing

我怎样才能让我的路由识别一个可选的前缀参数,如下所示:

/*lang/controller/id

因为 lang 部分是可选的,如果未在 URL 中指定,则具有默认值:

/en/posts/1   => lang = en
/fr/posts/1   => lang = fr
/posts/1      => lang = en

编辑

理想情况下,我希望通过映射命名空间在多个 Controller 和操作中执行此操作:

map.namespace "*lang" do |lang|
  lang.resources :posts
  lang.resources :stories
end

最佳答案

好的,我已经设法解决了这个问题:

默认情况下,在 Rails 中没有办法做到这一点(至少现在还没有)。我没有使用 namespace 和默认值,而是需要安装 Sven Fuchs' routing filter .

安装插件后,我将以下文件添加到我的 lib 目录:

require 'routing_filter/base'

module RoutingFilter
  class Locale < Base

    # remove the locale from the beginning of the path, pass the path
    # to the given block and set it to the resulting params hash
    def around_recognize(path, env, &block)
      locale = nil
      path.sub! %r(^/([a-zA-Z]{2})(?=/|$)) do locale = $1; '' end
      returning yield do |params|
        params[:locale] = locale || 'en'
      end
    end

    def around_generate(*args, &block)
      locale = args.extract_options!.delete(:locale) || 'en'
      returning yield do |result|
        if locale != 'en'
          result.sub!(%r(^(http.?://[^/]*)?(.*))){ "#{$1}/#{locale}#{$2}" }
        end 
      end
    end

  end
end

我在 routes.rb 中添加了这一行:

map.filter 'locale'

这基本上填写了一个前后 Hook ,由插件生成,它包装了 rails 路由。

当一个 url 被识别时,在 Rails 开始对它做任何事情之前,around_recognize 方法被调用。这将提取代表语言环境的两个字母代码,并在参数中传递它,如果未指定语言环境,则默认为“en”。

同样,当生成一个 url 时,locale 参数将被推送到左侧的 URL 中。

这给了我以下 url 和映射:

/   => :locale => 'en'
/en => :locale => 'en'
/fr => :locale => 'fr'

所有现有的 url 助手都像以前一样工作,唯一的区别是除非指定语言环境,否则它会被保留:

home_path                  => /
home_path(:locale => 'en') => /
home_path(:locale => 'fr') => /fr

关于ruby-on-rails - 使用可选路径前缀创建路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/212425/

相关文章:

ruby-on-rails - 尝试更改密码时设计警告: Can't mass-assign protected attributes: current_password

php - laravel 从带有实际点的文件夹名称加载 View

ruby-on-rails - 如何在 Ruby on Rails 中使用 include 或 join 获取其他表的结果

javascript - 如何导航到 Framework7 中的页面

ruby-on-rails - 确定路径是否存在作为 Rails Controller 中的路由

ruby-on-rails - 获取Rails中公共(public)文件夹内文件的绝对路径

ruby-on-rails - Rails 事务不会因验证错误而回滚

ruby-on-rails - rails 中的辅助方法问题

ruby - Rails3 中的 rescue_action 如何工作?

ruby - 如何告诉 Ruby 不要序列化属性或如何正确重载 marshal_dump?