Ruby on rails 如何更改Rails 3路由中的默认参数名称?

Ruby on rails 如何更改Rails 3路由中的默认参数名称?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,在我的Rails 3项目中,我有如下路线列表: resources :projects do resources :studies end resources :sticky_notes resources :study_templates ... 目前默认情况下,这些路由的URL中的id可以使用params[:id]调用,但我希望能够使用params[:sticky_note_id]、params[:study_template_id]、params[:study_id]等调用它

在我的Rails 3项目中,我有如下路线列表:

resources :projects do
    resources :studies
end

resources :sticky_notes
resources :study_templates

...
目前默认情况下,这些路由的URL中的id可以使用params[: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文件进行所有的工作。:)有可能吗?

毕竟“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_控制器中,您可能需要区分调用它的资源,我通常会在相应的表单中添加一个隐藏字段,在其中我留下嵌套对象的对象的“分类”名称。。。像

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

...
...

希望这能帮你度过难关……

只是出于好奇:你为什么要这么做?好处是什么?我有很多嵌套路由,也可以在没有嵌套路由的情况下访问页面(即有projects/X/studies/Y和studies/Y)。其中一个问题是,我正在尝试创建一个通用的“note”系统,该系统根据URL中的参数(研究id、项目id等)存储注释。如果我可以通用地指定id名称,而不是总是测试params[:study\u id].nil?,如果是,则使用params[:id],如果不使用[:study\u id],等等,那么这将更容易实现。如果两个项目都有路径/:project\u id/studies/:id和projects/:project\u id/studies/:study\u id,我会同时执行这两种操作,我只是不知道除了写下我看到的所有路线(啊),还有没有其他简单的方法!这样控制器会变得非常拥挤。我在一些项目上也有同样的问题。让我们期待一个好的答案:)
如果两个项目都有路线有意义的话/:project\u id/studies/:id和projects/:project\u id/studies/:study\u id我会两者都做。
Route
projects/:project\u id/studies/:id
只是一个匹配器,而且
params[:id]
params[:study\u id]
都会匹配。所以,如果你要把它们都写下来,只有上面写的才行。这不是路由问题,而是控制器问题。您应该提供一个
:id
,例如
:type
。当然,您可以编写一个方法来生成路由。这自然意味着您必须设置一个散列/数组类型的容器来定义要生成的内容。。。这也可能是一个很大的工作。除此之外,我只想到元编程。我的意思是,在ruby中,您总是可以重新打开一个类并覆盖一个方法。因此,最好的方法可能是重新打开负责设置路由的类,并覆盖用于路由生成的方法“:{object.singularize}}u id”,无论默认情况下在何处使用“:id”耸耸肩,不知道该方法在何处。。。