Rails 路由 - 版本控制页面

Rails routing - versioning pages

我已经建立了一个路由 /locale/page 实际上非常简单的东西的页面。

# current frontend routes
# allows urls like /en/im-an-awesome-page
scope "(:locale)", :locale => /([a-zA-Z]{2}[-_])?[a-zA-Z]{2}/ do
  get '/*path' => 'pages#show', as: 'page'
end

现在我添加了添加不同版本页面的功能。如果我不必更改很多路由或视图,那将是最好的事情。我想为每个版本使用相同的布局。

url 模式可能是这样的:/version1/en/im-an-awesome-page

另一种可能性:/versions/1/en/im-an-awesome-page

试过了,但是如果我在没有任何版本的情况下调用它,我就陷入了死胡同, 页面应该也没有任何版本 显示(然后只显示最新版本)。

# needed frontend routes
# allows urls like /en/im-an-awesome-page
# NEW also allows urls like /version-1/en/im-an-awesome-page
scope ":version", defaults: { version: '' } do
  scope "(:locale)", :locale => /([a-zA-Z]{2}[-_])?[a-zA-Z]{2}/ do
    get '/*path' => 'pages#show', as: 'page'
  end
end

我对此很迷茫 - 任何帮助都会很棒!

编辑:页面树(整个url基础设施)因版本而异

所以你想要/version/1/en/im-an-awesome-page

我认为你最好把版本放在最后/en/im-an-awesome-page/version/1


这样你就可以拥有:

#config/routes.rb
scope "(:locale)", :locale => /([a-zA-Z]{2}[-_])?[a-zA-Z]{2}/ do
   resources :pages, path: "", only: :show do #-> url.com/en/:page_id
      get "version/:version", on: :member #-> url.com/en/:page_id/version/:version
   end
end

这将提供单独访问 "page" 以及一个版本的功能。

不同之处在于,如果没有定义 :version 参数,您可以 运行 使用最新版本:

#app/controllers/pages_controller.rb
class PagesContorller < ApplicationController
   def show
      @page = Page.find params[:id]
      if params[:version]
         ...
      else
         ...
      end
   end
end

也许可以试试这样:

scope "(version/:version)", defaults: { version: 'latest' } do
  scope "(:locale)", :locale => /([a-zA-Z]{2}[-_])?[a-zA-Z]{2}/ do
    get '/*path' => 'pages#show', as: 'page'
  end
end

然后在你的控制器中:

class PagesController < ApplicationController
  #...
  def show
    if params[:version] == 'latest'
      # find page by 'path' and max version
    else
      # find page by 'path' and params[:version]
    end
  end
end

您应该使用此 url 获得特定版本的页面:http://localhost:3000/version/1/en/the-page

最新的是: http://localhost:3000/en/the-page