簡體   English   中英

如何更改Rails 3路由中的默認參數名稱?

[英]How can I change the default parameter names in Rails 3 routing?

在我的Rails 3項目中,我有一個這樣的路由列表:

resources :projects do
    resources :studies
end

resources :sticky_notes
resources :study_templates

...

目前默認情況下,可以使用params [:id]調用來自這些路由的URL中的ID,但我希望能夠使用params [:sticky_note_id],params [:study_template_id],params [:study_id]等來調用它們。有沒有辦法可以為這些項目的ID指定參數名稱? 我是否必須在沒有“資源”的情況下手動編寫每條路線?

謝謝!

編輯:這是我正在嘗試做的一個例子:當路由定義如上所述時會發生這種情況:

resources :projects do
    resources :studies
end
# results in /projects/:project_id/studies/:id
# /projects/:project_id/studies/:id/edit
# /projects/:project_id/studies/:id/new
# etc.

resources :sticky_notes
# results in /sticky_notes/:id
# /sticky_notes/:id/edit
# /sticky_notes/:id/new
# etc.

這就是我要的:

match '/projects/:project_id/studies/:study_id' => 'studies#show'
match '/projects/:project_id/studies/:study_id/edit' => 'studies#edit'
match '/projects/:project_id/studies/:study_id/new' => 'studies#new'
...

# results in /projects/:project_id/studies/:study_id
# /projects/:project_id/studies/:study_id/edit
# etc

match '/sticky_notes/:sticky_note_id' => 'sticky_notes#show'
match '/sticky_notes/:sticky_note_id/edit' => 'sticky_notes#edit'
match '/sticky_notes/:sticky_note_id/new' => 'sticky_notes#new'
...

# results in /sticky_notes/:sticky_note_id
# /sticky_notes/:sticky_note_id/edit
# etc

我想要第二部分,但沒有完成我已經很大的路徑文件。 :) 可能嗎?

畢竟'routes.rb'只是一個簡單的ruby文件,所以為什么不使用ruby代碼甚至可以創建一個方法來生成必要的路由..讓我們看一個使用資源數組的簡單示例,如果你想要使用嵌套資源,您可能希望修改方法以使用哈希鏈來傳遞要添加成員的資源:

def add_nested_resource(toadd=nil, controller=nil, resources=[])
  return if toadd.nil? || controller.nil? || ressources.empty?
  resources.each { |x|
    resources x do
      resources toadd, :controller => controller
    end
  }
end

add_nested_resource(:notes, "notes", [:resource1, :resource2, ..., :resourceX]

相當於

resources :resource1 do
  resources :notes, :controller => "notes"
end
resources :resource2 do
  resources :notes, :controller => "notes"
end
.
.
.
resources :resourceX do
  resources :notes, :controller => "notes"
end

這樣你就可以輕松地編寫很多路徑。 當然,在notes_controller中你可能需要區分哪個資源調用了它,我通常在相應的表單中添加一個隱藏字段,在這里我留下嵌套對象的對象的“分類”名稱...就像

<%= form_for ... someform for resource1... do |f| %> 
 ...
 <%= hidden_field_tag :nesting_object, "Resource1" %>
 ...
<% end %>

希望這可以幫助你度過難關......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM