Skip to content

Commit 0d3bca6

Browse files
authored
Add option to use a custom controller for passwordless_for routes. (mikker#152)
1 parent c459557 commit 0d3bca6

File tree

5 files changed

+41
-12
lines changed

5 files changed

+41
-12
lines changed

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,20 @@ Please note that, from a security standpoint, this is a **bad practice** because
140140

141141
See [the bundled views](https://github.com/mikker/passwordless/tree/master/app/views/passwordless).
142142

143+
### Using a custom controller
144+
145+
``` ruby
146+
Rails.application.routes.draw do
147+
passwordless_for :users, controller: 'sessions'
148+
149+
# other routes
150+
end
151+
152+
class SessionsController < Passwordless::SessionsController
153+
end
154+
```
155+
156+
143157
### Registering new users
144158

145159
Because your `User` record is like any other record, you create one like you normally would. Passwordless provides a helper method to sign in the created user after it is saved – like so:

lib/passwordless/router_helpers.rb

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ module RouterHelpers
88
# passwordless_for :users
99
# # or with options ...
1010
# passwordless_for :users, at: 'session_stuff', as: :user_session_things
11+
# # or with a custom controller ...
12+
# passwordless_for :users, controller: 'my_custom_controller'
1113
# @param resource [Symbol] the pluralized symbol of a Model (e.g - :users).
1214
# @param at [String] Optional - provide custom path for the passwordless
1315
# engine to get mounted at (using the above example your URLs end
@@ -16,15 +18,23 @@ module RouterHelpers
1618
# helpers (using the above example in a view:
1719
# <%= link_to 'Sign in', user_session_things.sign_in_path %>).
1820
# (Default: resource.to_s)
19-
def passwordless_for(resource, at: :na, as: :na)
21+
# @param controller [String] Optional - provide a custom controller for
22+
# sessions to use (using the above example the controller called would be MyCustomController
23+
# (Default: 'passwordless/sessions')
24+
def passwordless_for(resource, at: :na, as: :na, controller: 'passwordless/sessions')
2025
at == :na && at = "/#{resource.to_s}"
21-
as == :na && as = "#{resource.to_s}_"
26+
as == :na && as = resource.to_s
2227

23-
scope(defaults: {authenticatable: resource.to_s.singularize, resource: resource}) do
24-
get("#{at}/sign_in", to: "passwordless/sessions#new", as: :"#{as}sign_in")
25-
post("#{at}/sign_in", to: "passwordless/sessions#create")
26-
get("#{at}/sign_in/:token", to: "passwordless/sessions#show", as: :"#{as}token_sign_in")
27-
match("#{at}/sign_out", to: "passwordless/sessions#destroy", via: %i[get delete], as: :"#{as}sign_out")
28+
defaults = {
29+
authenticatable: resource.to_s.singularize,
30+
resource: resource,
31+
}
32+
33+
scope(defaults: defaults) do
34+
get("#{at}/sign_in", to: "#{controller}#new", as: :"#{as}_sign_in")
35+
post("#{at}/sign_in", to: "#{controller}#create")
36+
get("#{at}/sign_in/:token", to: "#{controller}#show", as: :"#{as}_token_sign_in")
37+
match("#{at}/sign_out", to: "#{controller}#destroy", via: %i[get delete], as: :"#{as}_sign_out")
2838
end
2939
end
3040
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
class Admin
3+
class SessionsController < Passwordless::SessionsController
4+
end
5+
end

test/dummy/config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
Rails.application.routes.draw do
44
passwordless_for(:users)
5-
passwordless_for(:admins)
5+
passwordless_for(:admins, controller: 'admin/sessions')
66

77
resources(:users)
88
resources(:registrations, only: %i[new create])

test/passwordless_for_test.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class PasswordlessForTest < ActionDispatch::IntegrationTest
5454
test("map sign in for admin") do
5555
assert_recognizes(
5656
{
57-
controller: "passwordless/sessions",
57+
controller: "admin/sessions",
5858
action: "new",
5959
authenticatable: "admin",
6060
resource: "admins"
@@ -65,7 +65,7 @@ class PasswordlessForTest < ActionDispatch::IntegrationTest
6565

6666
assert_recognizes(
6767
{
68-
controller: "passwordless/sessions",
68+
controller: "admin/sessions",
6969
action: "create",
7070
authenticatable: "admin",
7171
resource: "admins"
@@ -76,7 +76,7 @@ class PasswordlessForTest < ActionDispatch::IntegrationTest
7676

7777
assert_recognizes(
7878
{
79-
controller: "passwordless/sessions",
79+
controller: "admin/sessions",
8080
action: "show",
8181
authenticatable: "admin",
8282
resource: "admins",
@@ -88,7 +88,7 @@ class PasswordlessForTest < ActionDispatch::IntegrationTest
8888

8989
assert_recognizes(
9090
{
91-
controller: "passwordless/sessions",
91+
controller: "admin/sessions",
9292
action: "destroy",
9393
authenticatable: "admin",
9494
resource: "admins"

0 commit comments

Comments
 (0)