Dan*_*ley 14 model-view-controller ruby-on-rails url-routing
我希望能够根据数据库中的信息动态地将URL映射到控制器.
我正在寻找功能相当的东西(假设一个View
模型):
map.route '/:view_name',
:controller => lambda { View.find_by_name(params[:view_name]).controller }
Run Code Online (Sandbox Code Playgroud)
其他人建议动态重建路由,但这对我不起作用,因为可能有数千个视图映射到同一个Controller
Dee*_*mar 13
这个问题很古老,但我发现它很有趣.可以使用路由器路由到Rack端点的功能在Rails 3中创建完全可用的解决方案.
创建以下Rack类:
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
Run Code Online (Sandbox Code Playgroud)
在路线
match '/:view_name', :to => MyRouter.new, :via => :get
Run Code Online (Sandbox Code Playgroud)
提示从http://guides.rubyonrails.org/routing.html#routing-to-rack-applications中提到,"为了好奇,'帖子#index'实际上扩展为PostsController.action(:index),返回一个有效的Rack应用程序."
在Rails 3.2.13中测试的变体.
所以我认为您是在问,是否有一个视图表和一个视图模型,该表看起来像
id | name | model
===================
1 | aaa | Post
2 | bbb | Post
3 | ccc | Comment
Run Code Online (Sandbox Code Playgroud)
您希望 /aaa 的 url 指向 Post.controller - 这是正确的吗?
如果没有,那么假设它有效,那么您的建议似乎很好。
您可以将其发送到 catch all 操作,并让该操作查看 url,运行 find_by_name,然后从那里调用正确的控制器。
def catch_all
View.find_by_name('aaa').controller.action
end
Run Code Online (Sandbox Code Playgroud)
您可以使用redirect_to甚至发送参数。在下面的示例中,我发送搜索参数
def catch_all
new_controller = View.find_by_name('aaa').controller
redirect_to :controller => new_controller, :action => :index,
:search => params[:search]
end
Run Code Online (Sandbox Code Playgroud)