在我的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
我想要第二部分,但没有完成我已经很大的路径文件。 :)有可能吗?
答案 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 %>
希望这可以帮助您度过难关......