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
我已经建立了一个路由 /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