app/controllers/dry_crud/rememberable.rb
module DryCrud
# Remembers certain params of the index action in order to return
# to the same list after an entry was viewed or edited.
# If the index is called with a param :returning, the remembered params
# will be re-used to present the user the same list as she left it.
#
# Define a list of param keys that should be remembered for the list action
# with the class attribute +remember_params+.
#
# The params are stored separately for each different +remember_key+, which
# defaults to the current request's path.
module Rememberable
extend ActiveSupport::Concern
included do
class_attribute :remember_params
self.remember_params = %w[q sort sort_dir page]
before_action :handle_remember_params, only: [:index]
end
private
# Store and restore the corresponding params.
def handle_remember_params
remembered = remembered_params
restore_params_on_return(remembered)
store_current_params(remembered)
clear_void_params(remembered)
end
def restore_params_on_return(remembered)
if params[:returning]
remember_params.each { |p| params[p] ||= remembered[p] }
end
end
def store_current_params(remembered)
remember_params.each do |p|
remembered[p] = params[p].presence
remembered.delete(p) if remembered[p].nil?
end
end
def clear_void_params(remembered)
session[:list_params].delete(remember_key) if remembered.blank?
end
# Get the params stored in the session.
def remembered_params
session[:list_params] ||= {}
session[:list_params][remember_key] ||= {}
session[:list_params][remember_key]
end
# Params are stored by request path to play nice when a controller
# is used in different routes.
def remember_key
request.path
end
end
end