2009-12-14 88 views
0

我想在我的rails應用程序中設置dnamic路由。從內容製作動態路由

我有具有名稱屬性的行爲模型。

name:string。

我試圖做的是使用該名稱作爲我的網址。

中如果有

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

以下添加到您的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. 該路線是一個捕獲所有。你將陷入與其上面的路線不匹配的一切。所以確保它是最後的,並確保你已經準備好處理404s等。
  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 

這擺脫了一些陷阱,但給你更少的嵌套等選項。