我正在创建页面管理员设置。页面可能包含子页面,我有一堆功能来创建尾随的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!
无论哪种方式都可以正常工作......只是好奇。
答案 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