我希望能够根据我的数据库中的信息动态地将URL映射到控制器.
map.route '/:view_name',:controller => lambda { View.find_by_name(params[:view_name]).controller }
其他人建议dynamically rebuilding the routes,但这对我来说不起作用,因为可能有数千个视图映射到同一个控制器
解决方法
这个问题很旧,但我觉得很有趣.可以使用路由器的路由到Rack端点的功能,在Rails 3中创建一个全面的解决方案.
创建以下机架类:
class MyRouter def call(env) # Matched from routes,you can access all matched parameters view_name= env['action_dispatch.request.path_parameters'][:view_name] # Compute these the way you like,possibly using view_name controller= 'post' my_action= 'show' controller_class= (controller + '_controller').camelize.constantize controller_class.action(my_action.to_sym).call(env) end end
路线
match '/:view_name',:to => MyRouter.new,:via => :get
提示从http://guides.rubyonrails.org/routing.html#routing-to-rack-applications开始说:“对于好奇,”#索引“实际上扩展到PostsController.action(:index),它返回一个有效的Rack应用程序.
在Rails 3.2.13中测试的一个变体.