2009-11-21 30 views
0

我想了解如何直接改變這個規則對map.resources:Rails的REST風格的路線:覆蓋PARAMS [:ID]或PARAMS [:MODEL_ID]默認

假設我有一個路線:

map.resource :user, :as => ':user', :shallow => true do |user| 
    user.resources :docs, :shallow => true do |file| 
     file.resources :specs 
    end 
end 

所以我會REST風格的路線是這樣的:

/:用戶/文檔

/文檔/:ID

/文檔/:DOC_ID /規格

因此,我認爲這是很難跟蹤params[:doc_id]在這種情況下,因爲有時它params[:id],有時它params[:doc_id]在這種情況下,我想隨時撥打一個特定的名字所以我不必爲我的過濾器創建兩個不同的聲明。

好吧,我做了一點點研究,我發現這個補丁:

http://dev.rubyonrails.org/ticket/6814

,基本上這樣做是給你添加的功能:關鍵參數上你map.resources所以你可以定義你想如何引用它以後,所以我們可以有這樣的事:

map.resources :docs, :key => :doc ... 

,所以我總是會叫帕拉姆與params[:doc]代替。

但實際上這個補丁有點舊(3年現在) 所以我想知道如果我們沒有任何新的東西,並且已經內置了rails來完成這個任務嗎?

P.S我不知道有關模型中定義的方法to_param,顯然這並沒有對我的要求改變什麼,並在日誌中我仍然得到: Parameters: {"doc_id"=>"6"}Parameters: {"id"=>"6"}所有的時間。

回答

0

使得參數多一點友好,而無需編寫完全定製路由的一種方法是

# docs_controller.rb 
def show 
    @doc = Doc.find(params[:doc].to_i) 
end 

# doc.rb 
def to_param 
    [ id, permalink ].join("-") 
    # assumes you're storing a permalink formatted version of the name of your doc 
end 

# routes.rb 
map.resources :docs 

這會給你看起來像網址example.com/docs/234-the-name-of - 你的文檔

+0

我發佈後發佈,我不完全回答你的問題。 Rails沒有你正在尋找的內置功能,指向當前資源的params [:id]的默認值仍然是要走的路。爲了一致性,父記錄獲取參數[:parent_id]。對於當前資源之外的全局過濾器,爲什麼不將恰當的變量作爲參數傳遞給過濾器? – bensie 2009-11-21 18:45:58

+0

是的,沒錯,謝謝bensie。但仍然,這件事關於不給你改變資源鍵的可能性,它的那種毫無意義的不是嗎?在這種情況下會有什麼缺點? 我不明白:\ – zanona 2009-11-21 19:21:09