Rails静态页面路由vs:constraints => {:url => /.+/} - 利弊

时间:2012-03-09 22:37:57

标签: ruby-on-rails routes

我正在创建页面管理员设置。页面可能包含子页面,我有一堆功能来创建尾随的URL字符串。无论如何,只是想知道这里的利弊是什么。速度方面或我没有真正考虑的任何事情(除了可能与其他路线匹配更多/更少的灵活性):

选项1 - 将所有内容与网页匹配:

get ':url' => 'pages#show', :constraints => { :url => /.+/ }
# with @page = Page.find_by_url("/"+params[:url]) in my controller

选项2 - 静态地将路线映射到页面,并在每次保存后重新加载路线

if Page.table_exists? # Otherwise on rake db:migrate this file will be called and throw an error
  Page.all.each do |page|
    match page.url, :controller => 'pages', :action => 'show', :page_id => page.id
  end
end
# Then after pages save it calls MyApp::Application.reload_routes!

无论哪种方式都可以正常工作......只是好奇。

2 个答案:

答案 0 :(得分:1)

Option-1非常出色,无论您的部署环境如何,它都能正常运行,Option-2在任何非平凡的部署中都会失败。

假设您有两个网络服务器进程, P1 P2 ;它们可能位于同一台计算机,单独的计算机上,也可能位于同一台计算机上的不同VM中。假设有些人保存了一个恰好进入 P1 的新页面;然后 P1 将更新数据库( P1 P2 之间的共享资源)并重建其路由表。但现在 P1 有正确的路由信息​​,但是 P2 与旧的路由信息​​相关,因为没有人告诉它有些事情发生了变化。

你可以设置一些轮询或广播系统但是当Option-1按原样正常工作时,这只会是一堆无意义的复杂性。

答案 1 :(得分:0)

您可以使用路线限制:

 get ':url' => 'pages#show', :constraints => lambda {|request| Page.all.map(&:url).include?(request.path[1..-1]) }

尚未使用“全部捕获”到“未找到页面”

get '*not_found' => 'page#not_found'

http://guides.rubyonrails.org/routing.html#advanced-constraints