Rails History plugin
I felt annoyed enough when having to redirect user back to their previous location in a hackish way that I wrote this plugin.
It avoids storing POST, PUT, DELETE and Ajax request. It also has a facility to specify actions not to store in the history.
If you are interested in the way this plugin work, check Xavier Noria's blog at http://advogato.org/person/fxn/diary.html?start=441.
1. Installation
Unpack into the vendor/plugin and that should be it.
2. Usage
In your app/controllers/application_controller.rb, add a history line like this:
class ApplicationController < ActionController::Base
history :default => "http://default.url.com/",
:max => 10
end
The history function accepts a hash of options
- :default, the default URL to redirect
- :max, the maximum locations to remember (five by defaults).
None of the parameters are required. If somebody knows of a better way to obtain the default URL, he is welcomed to tell me how.
You can use the method history_skip in your controller if you want to avoid certain location to be stored in the history. By default, action resulting from a POST, PUT, DELETE request or an Ajax request are not stored in the history.
class FooController < ApplicationController
history_skip :action_to_skip
def action_to_skip
# I will not be stored in the history
end
end
In your actions, you can then use the following methods:
- last_location: returns the last visited location, can be used with one numeric argument precising how many locations to go back in the history (1 by default),
- peek_last_location: like last_location but don't remove it from the history,
- redirect_back: redirect the user to the last location in history, it takes the same arguments as last_location,
- store_location(force = false): stores the current location in the history, set force parameter to true to store location even if it would be skipped.
Note that if you want to use the plugin to create a "back" link on a page, you must go back two times. For example, using this controller
class HistoryController < ApplicationController
def foo
end
def bar
end
def back
redirect_back(2)
end
end
I'll try to explain clearly why. Let's say that in your bar view, you create a back link wich links to the back action. Now a user visits foo then bar. What you want is your user being redirected to foo when clicking your "back" link. Now your user hits the link. The controller will call the back action. From its point of view, you are in the back action so going back one time would take you to the bar action.
3. License
This plugin is licensed under the MIT license. Complete license text is included in the MIT-LICENSE file.
4. Downloads
The current version is 0.2. For change details, see the changelog.
5. Documentation
The plugin apidoc is here.