【问题标题】:make dynamic routes from content从内容制作动态路由
【发布时间】:2009-12-14 21:11:19
【问题描述】:

我正在尝试在我的 rails 应用程序中设置动态路由。

我有一个具有 name 属性的行为模型。

名称:字符串。

我想要做的是使用该名称作为我的网址。

如果有的话在我的路线中

 map.connect 'blacktie/:id', :controller => 'acts', :action => 'show', :id => 3

这会将我带到http://0.0.0.0:3000/blacktie

我知道我可以做一些类似的事情

def map.controller_actions(controller, actions)
actions.each do |action|
  self.send("#{controller}_#{action}", "#{controller}/#{action}", :controller => controller, :action => action)
end

只是不确定这是否可能。

【问题讨论】:

    标签: ruby-on-rails routes


    【解决方案1】:

    将以下内容添加到您的config/routes.rb 底部

    map.connect '*url', :controller => 'acts', :action => 'show_page'
    

    然后在app/controllers/acts_controller.rb中定义如下

    def show_page
      url = params[:url]
      if Array === url
        url = url.join('/')
      else
        url = url.to_s
      end
    
      # you now have the path in url
      @act = Acts.find_by_name(url)
    
      if @act
        render :action => :show
      else
        redirect_to some_error_page, :status => 404
      end
    end
    

    上述方法的一些问题。

    1. 路线是一个包罗万象的路线。您将捕获与其上方路线不匹配的所有内容。因此,请确保它是最后的,并确保您已准备好处理 404 等问题。
    2. :url 参数是一个数组或字符串,具体取决于传入的路由。例如,/blacktie/night 将是一个值为 ['blacktie', 'night'] 的数组。这就是我在 show_page 开始时加入他们的原因。因此,您的 find_by_name 函数可能非常智能,并允许嵌套行为等。

    希望这会有所帮助。

    或者...

    将此添加到路线(在底部):

    map.connect ':name', :controller => "acts", :action => "show_page", 
                :requirements => {:name => /[\w|-]*/}
    

    这告诉 Rails 将任何符合要求的内容发送给您的处理程序。所以你的 show_page 将如下所示:

    def show_page
      @act = Acts.find_by_name(params[:name])
    
      if @act
        render :action => :show
      else
        redirect_to some_error_page, :status => 404
      end
    end
    

    这消除了一些陷阱,但为您提供了较少的嵌套等选项。

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 2021-01-11
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 2019-04-27
      • 2018-11-26
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多