Currently users can access their “profile” through many paths.
- localhost:3000/users/current_user
- localhost:3000/users/current
- localhost:3000/users/id#
How can I make it that they can only get to their “profile” through localhost:3000/users/current_user
One suggestion on the ‘what’ of your question: instead of the ideal url being localhost:3000/users/current_user I suggest localhost:3000/user or something even more descriptive such as localhost:3000/profile or localhost:3000/account.
Could you include the entries in your routes.rb? Even if Authlogic, etc. add routes to your app, they should do it in routes.rb. If you have the entry:
then that’s where the /users/123 route is coming from. I agree with Matchu that even if you don’t use /users/123 you should keep it and route other requests to it.
An Additional Idea
If you don’t want to get into the (kinda complicated, and not pretty) business of preserving model validation errors across redirects, here’s another way. I’m assuming from here that you already have map.resource :users, so that you have the 7 default actions on your UsersController (index, new, create, show, edit, update, destroy).
In your routes.rb:
You will need to update your form_for tag slightly:
Now, assuming you start on /profile, and click an edit link that takes you to /profile/edit (should show the form), if you fill out the form such that it fails validation then you should end up back on /profile/edit with the correct errors in the f.error_messages output.
Your controller code for edit should stay the same, and your code for update should be:
The render (rather than a redirect) preserves the state of the @user model (including errors) and just renders the edit template again. Since you directed it at the update_profile_path the url viewed by the user is still /profile/edit.