devise_invitable 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +72 -2
- data/VERSION +1 -1
- data/app/controllers/invitations_controller.rb +1 -1
- data/app/views/devise_mailer/invitation.html.erb +1 -1
- data/devise_invitable.gemspec +1 -1
- data/lib/devise/controllers/url_helpers.rb +2 -2
- data/lib/devise_invitable/routes.rb +6 -5
- data/test/integration/invitable_test.rb +2 -2
- data/test/mailers/invitation_test.rb +1 -1
- data/test/routes_test.rb +2 -2
- metadata +1 -1
data/README.rdoc
CHANGED
@@ -1,6 +1,76 @@
|
|
1
1
|
= devise_invitable
|
2
2
|
|
3
|
-
It adds support for send invitations by email (it requires to be authenticated) and accept the invitation setting the password.
|
3
|
+
It adds support to devise[http://github.com/plataformatec/devise] for send invitations by email (it requires to be authenticated) and accept the invitation setting the password.
|
4
|
+
|
5
|
+
== Installation
|
6
|
+
|
7
|
+
All gems are on gemcutter, so you need to add gemcutter to your sources if you haven’t yet:
|
8
|
+
|
9
|
+
sudo gem sources -a http://gemcutter.org/
|
10
|
+
|
11
|
+
Install devise_invitable gem, it should install dependencies (such as devise and warden):
|
12
|
+
|
13
|
+
sudo gem install devise_invitable
|
14
|
+
|
15
|
+
Configure devise_invitable inside your app (and warden and devise if you weren't using them):
|
16
|
+
|
17
|
+
config.gem 'warden'
|
18
|
+
config.gem 'devise'
|
19
|
+
config.gem 'devise_invitable'
|
20
|
+
|
21
|
+
== Basic Usage
|
22
|
+
|
23
|
+
Follow the walkthrough for devise with the following modifications.
|
24
|
+
|
25
|
+
Add t.invitable to the migration:
|
26
|
+
|
27
|
+
create_table :users do
|
28
|
+
...
|
29
|
+
t.invitable
|
30
|
+
...
|
31
|
+
end
|
32
|
+
add_index :users, :invitation_token # for invitable
|
33
|
+
|
34
|
+
Add :invitable to the devise line in your model:
|
35
|
+
|
36
|
+
class User < ActiveRecord::Base
|
37
|
+
devise ..., :invitable
|
38
|
+
end
|
39
|
+
|
40
|
+
If you are using devise :all, you can add :invitable to config.all in devise initializer:
|
41
|
+
Devise.setup do |config|
|
42
|
+
...
|
43
|
+
config.all = [..., :invitable]
|
44
|
+
...
|
45
|
+
end
|
46
|
+
|
47
|
+
== Model configuration
|
48
|
+
|
49
|
+
DeviseInvitable adds a new configuration option, :invite_for. It's the time a invitation is valid for. Default value is nil, which means invitation doesn't expire.
|
50
|
+
|
51
|
+
== Controller filters
|
52
|
+
|
53
|
+
It adds authenticate_resource! filter to restrict who can send invitations. You can override this method in your ApplicationController. Default behavior is require authentication of the same resource_name, so if you only have a model with devise it will allow to all authenticated users to send invitations.
|
54
|
+
|
55
|
+
You have to configure mailer as it's required for confirmable and recoverable.
|
56
|
+
|
57
|
+
== I18n
|
58
|
+
|
59
|
+
It uses two flash messages, :send_invitation and :updated, which are translated as other flash messages from devise.
|
60
|
+
|
61
|
+
== Adding Invitable to a running application
|
62
|
+
|
63
|
+
Define a migration to add invitable to your model:
|
64
|
+
|
65
|
+
change_table :your_table do |t|
|
66
|
+
t.string :invitation_token, :limit => 20
|
67
|
+
t.datetime :invitation_sent_at
|
68
|
+
t.index :invitation_token
|
69
|
+
end
|
70
|
+
|
71
|
+
Add :invitable to the devise line of your model, or to config.all in devise initializer if your model uses devise :all.
|
72
|
+
|
73
|
+
Override authenticate_resource! filter if you need to customize who can send invitations.
|
4
74
|
|
5
75
|
== Note on Patches/Pull Requests
|
6
76
|
|
@@ -10,7 +80,7 @@ It adds support for send invitations by email (it requires to be authenticated)
|
|
10
80
|
future version unintentionally.
|
11
81
|
* Commit, do not mess with rakefile, version, or history.
|
12
82
|
(if you want to have your own version, that is fine but
|
13
|
-
|
83
|
+
bump version in a commit by itself I can ignore when I pull)
|
14
84
|
* Send me a pull request. Bonus points for topic branches.
|
15
85
|
|
16
86
|
== Copyright
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
@@ -23,7 +23,7 @@ class InvitationsController < ApplicationController
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
# GET /resource/invitation/
|
26
|
+
# GET /resource/invitation/accept?invitation_token=abcdef
|
27
27
|
def edit
|
28
28
|
self.resource = resource_class.new
|
29
29
|
resource.invitation_token = params[:invitation_token]
|
@@ -2,7 +2,7 @@ Hello <%= @resource.email %>!
|
|
2
2
|
|
3
3
|
Someone has invited you to <%= root_url %>, you can accept it through the link below.
|
4
4
|
|
5
|
-
<%= link_to 'Accept invitation',
|
5
|
+
<%= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @resource.invitation_token) %>
|
6
6
|
|
7
7
|
If you don't want to accept the invitation, please ignore this email.
|
8
8
|
Your account won't be created until you access the link above and set your password.
|
data/devise_invitable.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Devise::Controllers::UrlHelpers.module_eval do
|
2
2
|
[:path, :url].each do |path_or_url|
|
3
|
-
[nil, :new_, :
|
3
|
+
[nil, :new_, :accept_].each do |action|
|
4
4
|
class_eval <<-URL_HELPERS
|
5
5
|
def #{action}invitation_#{path_or_url}(resource, *args)
|
6
6
|
resource = case resource
|
@@ -17,4 +17,4 @@ Devise::Controllers::UrlHelpers.module_eval do
|
|
17
17
|
URL_HELPERS
|
18
18
|
end
|
19
19
|
end
|
20
|
-
end
|
20
|
+
end
|
@@ -12,15 +12,16 @@ module DeviseInvitable
|
|
12
12
|
# needed routes:
|
13
13
|
#
|
14
14
|
# # Invitation routes for Invitable, if User model has :invitable configured
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
15
|
+
# new_user_invitation GET /users/invitation/new(.:format) {:controller=>"invitations", :action=>"new"}
|
16
|
+
# user_invitation PUT /users/invitation(.:format) {:controller=>"invitations", :action=>"update"}
|
17
|
+
# POST /users/invitation(.:format) {:controller=>"invitations", :action=>"create"}
|
18
|
+
# accept_user_invitation GET /users/invitation/accept(.:format) {:controller=>"invitations", :action=>"edit"}
|
19
19
|
#
|
20
20
|
|
21
21
|
protected
|
22
22
|
def invitable(routes, mapping)
|
23
|
-
routes.resource :invitation, :only => [:new, :create, :
|
23
|
+
routes.resource :invitation, :only => [:new, :create, :update], :as => mapping.path_names[:invitation]
|
24
|
+
routes.send(:"accept_#{mapping.name}_invitation", mapping.path_names[:accept] || 'accept', :controller => 'invitations', :action => 'edit', :name_prefix => nil, :path_prefix => "#{mapping.as}/invitation", :conditions => { :method => :get })
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
@@ -17,7 +17,7 @@ class InvitationTest < ActionController::IntegrationTest
|
|
17
17
|
|
18
18
|
def set_password(options={}, &block)
|
19
19
|
unless options[:visit] == false
|
20
|
-
visit
|
20
|
+
visit accept_user_invitation_path(:invitation_token => options[:invitation_token])
|
21
21
|
end
|
22
22
|
assert_response :success
|
23
23
|
assert_template 'invitations/edit'
|
@@ -59,7 +59,7 @@ class InvitationTest < ActionController::IntegrationTest
|
|
59
59
|
test 'authenticated user should not be able to visit edit invitation page' do
|
60
60
|
sign_in_as_user
|
61
61
|
|
62
|
-
get
|
62
|
+
get accept_user_invitation_path
|
63
63
|
|
64
64
|
assert_response :redirect
|
65
65
|
assert_redirected_to root_path
|
@@ -56,7 +56,7 @@ class InviationTest < ActionMailer::TestCase
|
|
56
56
|
|
57
57
|
test 'body should have link to confirm the account' do
|
58
58
|
host = ActionMailer::Base.default_url_options[:host]
|
59
|
-
invitation_url_regexp = %r{<a href=\"http://#{host}/users/invitation/
|
59
|
+
invitation_url_regexp = %r{<a href=\"http://#{host}/users/invitation/accept\?invitation_token=#{user.invitation_token}">}
|
60
60
|
assert_match invitation_url_regexp, mail.body
|
61
61
|
end
|
62
62
|
end
|
data/test/routes_test.rb
CHANGED
@@ -10,8 +10,8 @@ class MapRoutingTest < ActionController::TestCase
|
|
10
10
|
assert_recognizes({:controller => 'invitations', :action => 'create'}, {:path => 'users/invitation', :method => :post})
|
11
11
|
end
|
12
12
|
|
13
|
-
test 'map
|
14
|
-
assert_recognizes({:controller => 'invitations', :action => 'edit'}, 'users/invitation/
|
13
|
+
test 'map accept user invitation' do
|
14
|
+
assert_recognizes({:controller => 'invitations', :action => 'edit'}, 'users/invitation/accept')
|
15
15
|
end
|
16
16
|
|
17
17
|
test 'map update user invitation' do
|