Я взял ответ Джастиса и изменил его, чтобы использовать вместо него сессии.
Насколько я вижу, сеансы проще, чем добавление URL-адреса в качестве параметра, но они могут вести себя неожиданно, например, когда пользователь просматривает сайт на нескольких вкладках. Использование сессий менее RESTfull, но проще и чище.
При использовании CanCan, установка пути перенаправления может быть выполнена в центральном месте: место, где обрабатываются исключения «отказано в доступе»:
rescue_from CanCan::AccessDenied do |exception|
if current_user.nil?
session[:next] = request.fullpath
puts session[:next]
redirect_to new_user_session_path, :alert => exception.message
else
render :file => "#{Rails.root}/public/403.html", :status => 403
end
end
Но вы можете установить это где угодно, на самом деле:
def edit
if current_user.roles[:moderator].nil?
session[:next] = "/contact"
redirect_to new_user_session_path, :alert => "please contact the moderator for access"
end
# ...
end
Затем в ApplicationController
вы можете повторно использовать это значение сеанса. Убедитесь, что удалили его тоже, хотя.
def after_sign_in_path_for(resource)
path = ''
if session[:next]
path = session[:next]
session[:next] = nil
else
path = super
end
path
end