【问题标题】:how to create dynamic routes and helpers in rails3如何在 rails3 中创建动态路由和助手
【发布时间】:2013-05-09 18:01:59
【问题描述】:

我的任务是在运行时创建不同 url 的映射。
在应用程序中,我有一个 GUI 界面,它显示来自 routes.rb 文件的路线列表。
用户可以从界面将该网址更改为不同的名称
例如。 (abc/mno) --user 可以将它们更改为 --(hello)
所以如果用户在浏览器中输入 /hello 请求会被重定向到 /abc/mno
我必须将这些映射路线存储在数据库中。
如何在数据库中创建新记录时将动态映射路由添加到已定义的路由(routes.rb)
如何在加载 routes.rb 文件时从数据库中添加路由。
我无法弄清楚如何扩展默认路由器,以便它可以包含来自数据库的路由..

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 routes


    【解决方案1】:

    我没有给你一个完整的解决方案,但你可以从两种方法开始:

    【讨论】:

    • 创建处理所有路由的控制器的问题是..当用户从 gui 创建映射时,直到我再次重新启动服务器时才会反映映射..不同的 path_helpers 也不可用
    • @BlueSmith BlueSmith 发布的第二个链接几乎已失效。显示的示例是一个很好的起点,更改应该是直接做你想做的。
    【解决方案2】:

    如果不想使用机架中间件,可以使用约束。希望您的动态路由的范围是一些东西,例如“/abc/anything-after-here-can-be-dynamic”,而不是直接从根...

    因此,假设您想要基于用户名字的动态路由,那么您将执行以下操作:

    #config/routes.rb
    match '/abc/:route' => "abc#dynamicroute", :contraints => DynamicRouteConstraint.new
    
    #lib/dynamic_route_constraint.rb
    class DynamicRouteConstraint < Struct.new
      def matches?(request)
        User.find_by_first_name(request.params[:route]).present?
      end
    end
    
    #app/controllers/abc_controller.rb
    class AbcController < ApplicationController
      def dynamicroute
        @user = User.find_by_first_name(params[:route])
        #render or redirect, however you wish
      end
    end
    

    【讨论】:

    • 你不需要实例化一个新对象,你可以调用一个类方法。 +1 对您的回答,因为它启发了我实施自己的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多