在url中没有控制器名称的嵌套资源

时间:2010-07-07 15:07:16

标签: ruby-on-rails routing device

我有一个非常简单的Rails 3应用程序,其中包含由Devise和Notes模型运行的用户模型。现在,网址和路由如下所示:

# url
/users/MEMBERNAME/notes/TITLE-OF-NOTE

# routing
resources :users do
  resources :notes
end

但我希望网址看起来像这样,在这种情况下路由会是什么样子?

# url
/MEMBERNAME/TITLE-OF-NOTE

更新

谢谢,现在我发现了一个新问题。在我的表格中,我有这段代码:

<%= form_for([@user, @note]) do |f| %> 

在我的控制器中我重定向如下:

format.html { redirect_to([@user, @note], :notice => 'Note was successfully created.') } 

在我使用@user的情况下,@ note旧网址仍然存在。您知道如何翻译表单和重定向以使用成员/标题结构吗?

提前致谢!

2 个答案:

答案 0 :(得分:5)

您可以在此处使用自定义路线:

get "/:user_id/:id", :to => "notes#show", :as => :short_user_note

希望这有帮助!

<强>更新

使用新创建的命名路线:

# => /USER_NAME/NOTE_NAME
redirect_to short_user_note_path(@user, @note)

# => /user/USER_NAME/note/NOTE_NAME
redirect_to user_note_path(@user, @note)
# OR
redirect_to url_for([@user, @note])
# OR
redirect_to [@user, @note]

因此,一般规则是,如果将一个active_record对象数组传递给#redirect_to,#url_for或#form_for方法,则会在内部调用#polymorphic_url方法,并生成标准的RESTful路径。

答案 1 :(得分:5)

你可以使用Rails 3中的工作路线助手来完成路线行为,如下所示:

resources :users, :path => ''
resources :users, :path => '', :only => [] do
  resources :notes, :path => '', :except => [:index]
end

有关我如何达成此解决方案的详细信息,请参阅我的blog post

相关问题