views:

18

answers:

1

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!

+1  A: 

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.

Aaron Qian
Thanks for the answer. I've updated my question above.
Alfred Nerstu
I updated the answer, hopefully it helps
Aaron Qian