Deviseの小技2つです。
1. deviseでログインに失敗した際にアクセスされたページを元に任意のページへ飛ばす。
1
2
3
4
5
6
| # config/initializers/devise.rb
Devise.setup do |config|
config.warden do |manager|
manager.failure_app = CustomAuthenticationFailure
end
end
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| # lib/custom_authentication_failure.rb
class CustomAuthenticationFailure < Devise::FailureApp
protected
def redirect_url
uri = URI.parse(warden_options[:attempted_path])
if uri.path.start_with?('/admin')
hogehoge_url # adminではじまる場合に飛ばしたいurl
else
super # それ以外の場合は通常のdeviseの処理へ流す
end
end
end
|
warden_options[:attempted_path]でアクセスしようとしたパスが参照できます
2. ログインエリアのurlにアクセスした時に保存するurlを操作
deviseはデフォルトでログインエリアにアクセスした際に未ログイン状態だとそのアクセスしたパスをsessionに保存してくれ、
ログイン後にそのurlにリダイレクトしてくれる機能があります。
特定のurlを覚えさせたくなかったのでパッチをあてました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # config/initializers/devise.rb
module StoreLocationPatch
def store_location_for(resource_or_scope, location)
return if URI.parse(location).path == '/' # rootへのアクセスは記憶させない
super
end
end
module Devise
module Controllers
module StoreLocation
prepend StoreLocationPatch
end
end
end
|