How do I redirect back to a page I'm currently on?
Asked Answered
D

5

22

In my users photo album page they see photos they have uploaded and each photo has a 'make default' link on it. When the user clicks make default, then the id of the photo is stored in the photo_id column of my profiles table.

The issue is redirecting them back to:

localhost:3000/settings/photo_gallery/:id

Is there a way I can redirect back to the photo album using the id of the photo that has just been set as the default? Can Rails find what album I want to redirect to just by looking at the id of a photo, as a photo belongs to a photo album, and a photo album has many photos?

I have the following tables in my database:

  • User(s): has one profile, has many PhotoAlbums
  • Profile(s): belongs to user
  • PhotoAlbum(s): belongs to user, has many photos
  • Photo(s): belongs to PhotoAlbum

Controller action:

def set_default_profile_photo

  photo = Profile.find_by_user_id(current_user.id)
  photo.photo_id = params[:photo_id]
  photo.save

  redirect_to "**HERE IS WHERE I'D LIKE TO REDIRECT TO THE PHOTOALBUM THE PHOTO IS IN**"
  flash[:success] = "Default photo set!"

end

My routes:

                    users GET    /users(.:format)                                  {:action=>"index", :controller=>"users"}
                          POST   /users(.:format)                                  {:action=>"create", :controller=>"users"}
                 new_user GET    /users/new(.:format)                              {:action=>"new", :controller=>"users"}
                edit_user GET    /users/:id/edit(.:format)                         {:action=>"edit", :controller=>"users"}
                     user GET    /users/:id(.:format)                              {:action=>"show", :controller=>"users"}
                          PUT    /users/:id(.:format)                              {:action=>"update", :controller=>"users"}
                          DELETE /users/:id(.:format)                              {:action=>"destroy", :controller=>"users"}
                 sessions GET    /sessions(.:format)                               {:action=>"index", :controller=>"sessions"}
                          POST   /sessions(.:format)                               {:action=>"create", :controller=>"sessions"}
              new_session GET    /sessions/new(.:format)                           {:action=>"new", :controller=>"sessions"}
             edit_session GET    /sessions/:id/edit(.:format)                      {:action=>"edit", :controller=>"sessions"}
                  session GET    /sessions/:id(.:format)                           {:action=>"show", :controller=>"sessions"}
                          PUT    /sessions/:id(.:format)                           {:action=>"update", :controller=>"sessions"}
                          DELETE /sessions/:id(.:format)                           {:action=>"destroy", :controller=>"sessions"}
                passwords GET    /passwords(.:format)                              {:action=>"index", :controller=>"passwords"}
                          POST   /passwords(.:format)                              {:action=>"create", :controller=>"passwords"}
             new_password GET    /passwords/new(.:format)                          {:action=>"new", :controller=>"passwords"}
            edit_password GET    /passwords/:id/edit(.:format)                     {:action=>"edit", :controller=>"passwords"}
                 password GET    /passwords/:id(.:format)                          {:action=>"show", :controller=>"passwords"}
                          PUT    /passwords/:id(.:format)                          {:action=>"update", :controller=>"passwords"}
                          DELETE /passwords/:id(.:format)                          {:action=>"destroy", :controller=>"passwords"}
                 profiles GET    /profiles(.:format)                               {:action=>"index", :controller=>"profiles"}
                          POST   /profiles(.:format)                               {:action=>"create", :controller=>"profiles"}
              new_profile GET    /profiles/new(.:format)                           {:action=>"new", :controller=>"profiles"}
             edit_profile GET    /profiles/:id/edit(.:format)                      {:action=>"edit", :controller=>"profiles"}
                  profile GET    /profiles/:id(.:format)                           {:action=>"show", :controller=>"profiles"}
                          PUT    /profiles/:id(.:format)                           {:action=>"update", :controller=>"profiles"}
                          DELETE /profiles/:id(.:format)                           {:action=>"destroy", :controller=>"profiles"}
                   emails GET    /emails(.:format)                                 {:action=>"index", :controller=>"emails"}
                          POST   /emails(.:format)                                 {:action=>"create", :controller=>"emails"}
                new_email GET    /emails/new(.:format)                             {:action=>"new", :controller=>"emails"}
               edit_email GET    /emails/:id/edit(.:format)                        {:action=>"edit", :controller=>"emails"}
                    email GET    /emails/:id(.:format)                             {:action=>"show", :controller=>"emails"}
                          PUT    /emails/:id(.:format)                             {:action=>"update", :controller=>"emails"}
                          DELETE /emails/:id(.:format)                             {:action=>"destroy", :controller=>"emails"}
                     root        /                                                 {:controller=>"users", :action=>"new"}
                  success        /success(.:format)                                {:action=>"success", :controller=>"users"}
                    login        /login(.:format)                                  {:action=>"new", :controller=>"sessions"}
                   logout        /logout(.:format)                                 {:action=>"destroy", :controller=>"sessions"}
           reset_password        /reset_password(.:format)                         {:action=>"new", :controller=>"passwords"}
       setup_new_password        /setup_new_password(.:format)                     {:action=>"edit", :controller=>"passwords"}
                 settings        /settings(.:format)                               {:action=>"settings", :controller=>"users"}
         settings_account        /settings/account(.:format)                       {:controller=>"users", :action=>"account"}
    settings_edit_profile        /settings/edit_profile(.:format)                  {:controller=>"profiles", :action=>"edit_profile"}
                                 /:username(.:format)                              {:controller=>"users", :action=>"show"}
          change_password        /change_password(.:format)                        {:action=>"change_password", :controller=>"users"}
profile_photo_set_default        /profile_photo/set_default(.:format)              {:controller=>"photo_albums", :action=>"set_default_profile_photo"}
  album_photo_set_default        /album_photo/set_default(.:format)                {:controller=>"photo_albums", :action=>"set_default_album_photo"}
             photo_albums GET    /settings/photo_gallery(.:format)                 {:action=>"index", :controller=>"photo_albums"}
                          POST   /settings/photo_gallery(.:format)                 {:action=>"create", :controller=>"photo_albums"}
          new_photo_album GET    /settings/photo_gallery/new(.:format)             {:action=>"new", :controller=>"photo_albums"}
         edit_photo_album GET    /settings/photo_gallery/:id/edit(.:format)        {:action=>"edit", :controller=>"photo_albums"}
              photo_album GET    /settings/photo_gallery/:id(.:format)             {:action=>"show", :controller=>"photo_albums"}
                          PUT    /settings/photo_gallery/:id(.:format)             {:action=>"update", :controller=>"photo_albums"}
                          DELETE /settings/photo_gallery/:id(.:format)             {:action=>"destroy", :controller=>"photo_albums"}
                   photos GET    /settings/photo_gallery/photos(.:format)          {:action=>"index", :controller=>"photos"}
                          POST   /settings/photo_gallery/photos(.:format)          {:action=>"create", :controller=>"photos"}
                new_photo GET    /settings/photo_gallery/photos/new(.:format)      {:action=>"new", :controller=>"photos"}
               edit_photo GET    /settings/photo_gallery/photos/:id/edit(.:format) {:action=>"edit", :controller=>"photos"}
                    photo GET    /settings/photo_gallery/photos/:id(.:format)      {:action=>"show", :controller=>"photos"}
                          PUT    /settings/photo_gallery/photos/:id(.:format)      {:action=>"update", :controller=>"photos"}
                          DELETE /settings/photo_gallery/photos/:id(.:format)      {:action=>"destroy", :controller=>"photos"}
Dissolution answered 21/1, 2012 at 11:7 Comment(1)
This link may be useful for you. Hope it will help. #2140496Angie
D
28

redirect_to :back worked for me but I want to see if this was the right choice http://api.rubyonrails.org/files/actionpack/lib/action_controller/metal/redirecting_rb.html

Dissolution answered 21/1, 2012 at 11:14 Comment(1)
Looks like the right thing to me. If you didn't have the option of using redirect_to :back, you could get the same result with redirect_to PhotoAlbum.where(:id => Photo.where(:id => params[:photo_id]).first.photo_album_id). There are better ways of doing this query but this should work.Illmannered
L
35

This is what you want:

redirect_to request.referrer

For further reference: http://en.wikipedia.org/wiki/HTTP_referer

Lyns answered 1/10, 2013 at 18:22 Comment(0)
D
28

redirect_to :back worked for me but I want to see if this was the right choice http://api.rubyonrails.org/files/actionpack/lib/action_controller/metal/redirecting_rb.html

Dissolution answered 21/1, 2012 at 11:14 Comment(1)
Looks like the right thing to me. If you didn't have the option of using redirect_to :back, you could get the same result with redirect_to PhotoAlbum.where(:id => Photo.where(:id => params[:photo_id]).first.photo_album_id). There are better ways of doing this query but this should work.Illmannered
B
28

In Rails 5 it was introduced the function:

redirect_back(fallback_location: root_path)

It does redirect back whenever the HTTP_REFERER is known. Otherwise it redirects to the fallback_location.

The redirect_to :back is deprecated and will be removed from Rails 5.1.

Bund answered 6/12, 2016 at 16:19 Comment(2)
How can I pass a notice object with the redirect_back statement in order to tell the user something went wrong with a flash message?Dahabeah
Well, I could solve this by doing: redirect_back(fallback_location: root_path, notice: "Something went wrong!"). Hope it could help somehow.Dahabeah
C
1

In one project we used the session for temporary storage, because redirect_to :back did not work for us. We had an def new where we set session[:return_to] = request.referer in the def create we added redirect_to session[:return_to]. I do not know anymore, why we could not use redirect_to :back

Clerestory answered 21/1, 2012 at 12:36 Comment(1)
The reason that you did not use redirect_to :back is most likely because you are wanting to go back two steps, i.e. if you went 'back' from create you would be taken back to new which is why you actually want to go back two steps to whatever was before new.Curvature
N
0

If you came from the photo_album page, you should be able to do:

redirect_to :back

Otherwise, you should be able to do a named route like:

redirect_to photo_album_path(photo.album_id) # or whatever the association key is

BTW, why do you have photo_albums mapping to photo_galleries? It's a lot less confusing if you named your resources and routes in a similiar manner. ie: if you wanted your route endpoints to use /photo_galleries you should name your resource PhotoGallery.

Nephograph answered 21/1, 2012 at 19:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.