'How can I reload the current page in Ruby on Rails?
I currently have a login popup in my header bar which is on every page in my website. I want to be able to reload the current page that the person is on after a successful login. How do I do this in the controller?
def create
#declaring and defining user variable stuff
if user.save
#reload current page <--how do I do this?
end
end
Thanks
Solution 1:[1]
For my application, I use redirect_to :back and it does the trick. However, I doubt this might have an error in a non general use case(s) (user came from a special page?) but i haven't found it so far in my app.
Solution 2:[2]
If you're looking for a way to get the page to refresh (typically redirect_to :back) with an XHR request, you don't have to look for a way to change the response type - just tell the page to reload with inline JS.
format.js { render inline: "location.reload();" }
Like Elena mentions, this should go in a respond_to block, like so:
respond_to do |format|
format.js {render inline: "location.reload();" }
end
Solution 3:[3]
In Rails 5 redirect_to :back is improved by:
redirect_back(fallback_location: root_path)
Solution 4:[4]
Archonic's answer above worked for me. However, in Rails 3, I had to place this in a respond_to block in order to avoid an 'ArgumentError (too few arguments)' error:
respond_to do |format|
format.js {render inline: "location.reload();" }
end
Solution 5:[5]
Since Rails 5 (or maybe older versions), you have a request.referrer method. You simply redirect from controller to referrer and it opens the page where request came from.
redirect_to request.referrer, notice: "You're being redirected"
Solution 6:[6]
Rails 5 introduced alternative function:
redirect_back(fallback_location: root_path)
It redirect back whenever the HTTP_REFERER is known. Otherwise it redirects to the fallback_location.
The redirect_to :back is deprecated in Rails 5.0 https://github.com/rails/rails/pull/22506 and removed since Rails 5.1
Solution 7:[7]
This syntax is what you want... works in Rails 6
respond_to do |format|
format.html { redirect_to request.referrer, notice: "User was successfully WHATEVER." }
end
Solution 8:[8]
Building on Archonic's and Elena's Answers, the reload function accepts a parameter to force the page to reload from the server aka forceGet, instead of from cache. A parameter can be set by the controller logic, like successful or failed login of a user, to trigger the desired behavior when it is sent to the page.
# force_get = controller_logic ? true : false
respond_to do |format|
format.js { render inline: "location.reload(#{force_get});" }
end
UPDATE: the logic has been deprecated for the forceGet option. If you do want to reload from the server you can use this logic:
# force_get = controller_logic ? true : false
respond_to do |format|
format.js { render inline: force_get ? "window.location.href = window.location.href;" : "location.reload();" }
end
Solution 9:[9]
just redirect to whatever url you want in the function:
redirect_to what_ever_path
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | datalost |
| Solution 2 | |
| Solution 3 | bishal |
| Solution 4 | Community |
| Solution 5 | Shobhit |
| Solution 6 | Kiryl Plyashkevich |
| Solution 7 | |
| Solution 8 | |
| Solution 9 | Mahan Mashoof |
