从内容制作动态路线

时间:2009-12-14 21:11:20

标签: ruby-on-rails routes

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

即。

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

名:字符串

我尝试做的是将该名称用作我的网址。

在我的路线中如果有

 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

只是不确定它是否可能。

1 个答案:

答案 0 :(得分: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 param是一个数组或字符串,具体取决于进入的路由。例如/blacktie/night将是一个值为['blacktie', 'night']的数组。这就是我在show_page开头加入他们的原因。因此,您的find_by_name函数可能非常智能,并允许嵌套行为等。
  3. 希望这有帮助。

    ... OR

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

    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
    

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