Nested resources without controller names in url
I've got a very simple Rails 3 app with a User model run by Devise and a Notes model. Right now the url and routing looks like this:
# url
/users/MEMBERNAME/notes/TITLE-OF-NOTE
# routing
resources :users do
resources :notes
end
But I would like the urls to look like this, how would the routing look like in this case?
# url
/MEMBERNAME/TITLE-OF-NOTE
Update:
Thanks, now I discovered a new problem though. In my forms I have this code:
<%= form_for([@user, @note]) do |f| %>
and in my controller I redirect like this:
format.html { redirect_to([@user, @note], :notice => 'Note was successfully created.') }
In both those cases when I use @user, @note the old urls are still present. Do you know how to translate the form and the 开发者_开发问答redirects to use the member/title structure?
Thanks in advance!
You can use a custom route here:
get "/:user_id/:id", :to => "notes#show", :as => :short_user_note
Hope this helps!
Update:
To use the newly created named route:
# => /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]
So, the general rule is if you pass an array of active_record objects like below to #redirect_to, #url_for or #form_for methods, the #polymorphic_url method is called internally, and generates the standard RESTful route.
You can the routes behaviour you're after with working route helpers in Rails 3 with like the following:
resources :users, :path => ''
resources :users, :path => '', :only => [] do
resources :notes, :path => '', :except => [:index]
end
See my blog post for the details on how I arrived at this solution.
精彩评论