动态URL - > Rails中路由的控制器映射

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中测试的变体.


Wil*_*ill 0

所以我认为您是在问,是否有一个视图表和一个视图模型,该表看起来像

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)