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

时间:2011-03-22 14:12:21

标签: ruby-on-rails ruby ruby-on-rails-3

在我的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

我想要第二部分,但没有完成我已经很大的路径文件。 :)有可能吗?

1 个答案:

答案 0 :(得分:0)

在所有'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 %>

希望这可以帮助您度过难关......