devise-multi_email 1.0.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +4 -1
- data/CHANGELOG.md +15 -2
- data/Gemfile +2 -9
- data/README.md +69 -18
- data/devise-multi_email.gemspec +4 -0
- data/examples/rails5_app/.gitignore +21 -0
- data/examples/rails5_app/Gemfile +55 -0
- data/examples/rails5_app/Gemfile.lock +185 -0
- data/examples/rails5_app/README.md +24 -0
- data/examples/rails5_app/Rakefile +6 -0
- data/examples/rails5_app/app/assets/config/manifest.js +3 -0
- data/examples/rails5_app/app/assets/images/.keep +0 -0
- data/examples/rails5_app/app/assets/javascripts/application.js +16 -0
- data/examples/rails5_app/app/assets/javascripts/cable.js +13 -0
- data/examples/rails5_app/app/assets/javascripts/channels/.keep +0 -0
- data/examples/rails5_app/app/assets/stylesheets/application.css +15 -0
- data/examples/rails5_app/app/channels/application_cable/channel.rb +4 -0
- data/examples/rails5_app/app/channels/application_cable/connection.rb +4 -0
- data/examples/rails5_app/app/controllers/application_controller.rb +3 -0
- data/examples/rails5_app/app/controllers/concerns/.keep +0 -0
- data/examples/rails5_app/app/helpers/application_helper.rb +2 -0
- data/examples/rails5_app/app/jobs/application_job.rb +2 -0
- data/examples/rails5_app/app/mailers/application_mailer.rb +4 -0
- data/examples/rails5_app/app/models/application_record.rb +3 -0
- data/examples/rails5_app/app/models/concerns/.keep +0 -0
- data/examples/rails5_app/app/models/email.rb +3 -0
- data/examples/rails5_app/app/models/user.rb +9 -0
- data/examples/rails5_app/app/views/layouts/application.html.erb +14 -0
- data/examples/rails5_app/app/views/layouts/mailer.html.erb +13 -0
- data/examples/rails5_app/app/views/layouts/mailer.text.erb +1 -0
- data/examples/rails5_app/bin/bundle +3 -0
- data/examples/rails5_app/bin/rails +4 -0
- data/examples/rails5_app/bin/rake +4 -0
- data/examples/rails5_app/bin/setup +34 -0
- data/examples/rails5_app/bin/update +29 -0
- data/examples/rails5_app/config/application.rb +15 -0
- data/examples/rails5_app/config/boot.rb +3 -0
- data/examples/rails5_app/config/cable.yml +9 -0
- data/examples/rails5_app/config/database.yml +25 -0
- data/examples/rails5_app/config/environment.rb +5 -0
- data/examples/rails5_app/config/environments/development.rb +56 -0
- data/examples/rails5_app/config/environments/production.rb +86 -0
- data/examples/rails5_app/config/environments/test.rb +42 -0
- data/examples/rails5_app/config/initializers/application_controller_renderer.rb +6 -0
- data/examples/rails5_app/config/initializers/assets.rb +11 -0
- data/examples/rails5_app/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/rails5_app/config/initializers/cookies_serializer.rb +5 -0
- data/examples/rails5_app/config/initializers/devise.rb +274 -0
- data/examples/rails5_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/examples/rails5_app/config/initializers/inflections.rb +16 -0
- data/examples/rails5_app/config/initializers/mime_types.rb +4 -0
- data/examples/rails5_app/config/initializers/new_framework_defaults.rb +24 -0
- data/examples/rails5_app/config/initializers/session_store.rb +3 -0
- data/examples/rails5_app/config/initializers/wrap_parameters.rb +14 -0
- data/examples/rails5_app/config/locales/devise.en.yml +62 -0
- data/examples/rails5_app/config/locales/en.yml +23 -0
- data/examples/rails5_app/config/puma.rb +47 -0
- data/examples/rails5_app/config/routes.rb +4 -0
- data/examples/rails5_app/config/secrets.yml +22 -0
- data/examples/rails5_app/config/spring.rb +6 -0
- data/examples/rails5_app/config.ru +5 -0
- data/examples/rails5_app/db/migrate/20170307140813_devise_create_users.rb +49 -0
- data/examples/rails5_app/db/migrate/20170307145547_add_password_salt_to_users.rb +5 -0
- data/examples/rails5_app/db/schema.rb +44 -0
- data/examples/rails5_app/db/seeds.rb +7 -0
- data/examples/rails5_app/lib/assets/.keep +0 -0
- data/examples/rails5_app/lib/tasks/.keep +0 -0
- data/examples/rails5_app/log/.keep +0 -0
- data/examples/rails5_app/public/404.html +67 -0
- data/examples/rails5_app/public/422.html +67 -0
- data/examples/rails5_app/public/500.html +66 -0
- data/examples/rails5_app/public/apple-touch-icon-precomposed.png +0 -0
- data/examples/rails5_app/public/apple-touch-icon.png +0 -0
- data/examples/rails5_app/public/favicon.ico +0 -0
- data/examples/rails5_app/public/robots.txt +5 -0
- data/examples/rails5_app/test/controllers/.keep +0 -0
- data/examples/rails5_app/test/fixtures/.keep +0 -0
- data/examples/rails5_app/test/fixtures/files/.keep +0 -0
- data/examples/rails5_app/test/helpers/.keep +0 -0
- data/examples/rails5_app/test/integration/.keep +0 -0
- data/examples/rails5_app/test/mailers/.keep +0 -0
- data/examples/rails5_app/test/models/.keep +0 -0
- data/examples/rails5_app/test/test_helper.rb +10 -0
- data/examples/rails5_app/tmp/.keep +0 -0
- data/examples/rails5_app/vendor/assets/javascripts/.keep +0 -0
- data/examples/rails5_app/vendor/assets/stylesheets/.keep +0 -0
- data/gemfiles/rails_4_2.gemfile +5 -0
- data/gemfiles/rails_5_0.gemfile +5 -0
- data/gemfiles/rails_5_1.gemfile +5 -0
- data/lib/devise/multi_email/association_manager.rb +30 -0
- data/lib/devise/multi_email/email_model_extensions.rb +20 -0
- data/lib/devise/multi_email/email_model_manager.rb +18 -0
- data/lib/devise/multi_email/models/authenticatable.rb +23 -44
- data/lib/devise/multi_email/models/confirmable.rb +20 -21
- data/lib/devise/multi_email/models/validatable.rb +42 -38
- data/lib/devise/multi_email/parent_model_extensions.rb +27 -0
- data/lib/devise/multi_email/parent_model_manager.rb +55 -0
- data/lib/devise/multi_email/version.rb +1 -1
- data/lib/devise/multi_email.rb +32 -0
- metadata +147 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ae0a4824abdf90e63b3a5027520c2d4ef6465e31
|
|
4
|
+
data.tar.gz: ae37353431e7e16eb565a0ba27c814020f644f3e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 232a734290ad0eab39000b8ecb76a3c6fc320ece267fdd43a52a1dadf726ee50cd97dae4c712de750a757ca48bbf72e9b7d6fc59b3e138b32414ee6b9d915e06
|
|
7
|
+
data.tar.gz: 658d6b2220f1eaf9ca811d4df1b669a938cb7a2911c803abc5546eec9def051756511228eff406b282d7e088084fd8610b7950b88f6d71f2ded2876a187e59f2
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
|
+
### 2.0.0 - 2017-05-12
|
|
2
|
+
|
|
3
|
+
* New `Devise::MultiEmail#configure` setup with options for `user` and `emails` associations and `primary_email` method names
|
|
4
|
+
* Refactor to expose `_multi_email_*` prefixed methods on models
|
|
5
|
+
* New `primary_email` method to get primary email record (however, can be configured as `primary_email_record` for backwards-compatibility)
|
|
6
|
+
* Changed logic when changing an email address to look up existing email record, otherwise creating a new one, then marking it "primary"
|
|
7
|
+
* Changed logic when changing an email address to mark all others as `primary = false`
|
|
8
|
+
* Changed logic when changing an email address to `nil` to mark as `primary = false` rather than deleting records
|
|
9
|
+
|
|
10
|
+
Many thanks to [joelvh](https://github.com/joelvh) for the great work!
|
|
11
|
+
|
|
1
12
|
### 1.0.5 - 2016-12-29
|
|
2
|
-
|
|
13
|
+
|
|
14
|
+
* New `.find_by_email` method. Thanks to [mrjlynch](https://github.com/mrjlynch).
|
|
3
15
|
|
|
4
16
|
### 1.0.4 - 2016-08-13
|
|
17
|
+
|
|
5
18
|
* Bug fix: Case-insentive configuration of email is ignored (#1). Thanks to [@fonglh](https://github.com/fonglh).
|
|
6
19
|
|
|
7
20
|
### 1.0.3 - 2016-02-18
|
|
8
21
|
|
|
9
|
-
* Bug fix: Fix a wrong error message which shows "Email can't be blank" when email does not exist.
|
|
22
|
+
* Bug fix: Fix a wrong error message which shows "Email can't be blank" when email does not exist.
|
|
10
23
|
|
|
11
24
|
### 1.0.2 - 2016-01-12
|
|
12
25
|
|
data/Gemfile
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
source 'https://rubygems.org'
|
|
2
2
|
|
|
3
|
-
# Specify your gem's dependencies in devise-multi_email.gemspec
|
|
4
|
-
gemspec
|
|
5
|
-
|
|
6
3
|
gem 'rails'
|
|
7
4
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
gem 'sqlite3'
|
|
11
|
-
gem 'capybara'
|
|
12
|
-
gem 'coveralls', require: false
|
|
13
|
-
end
|
|
5
|
+
# Specify your gem's dependencies in devise-multi_email.gemspec
|
|
6
|
+
gemspec
|
|
14
7
|
|
data/README.md
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
# Devise::MultiEmail [](https://travis-ci.org/allenwq/devise-multi_email) [](https://coveralls.io/github/allenwq/devise-multi_email?branch=master)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Letting [Devise](https://github.com/plataformatec/devise) support multiple emails, allows you to:
|
|
4
4
|
- Login with multiple emails
|
|
5
5
|
- Send confirmations to multiple emails
|
|
6
6
|
- Recover the password with any of the emails
|
|
7
|
-
- Validations for multiple emails
|
|
7
|
+
- Validations for multiple emails
|
|
8
8
|
|
|
9
|
-
`:multi_email_authenticatable`, `:multi_email_confirmable` and `:multi_email_validatable` are provided by
|
|
9
|
+
`:multi_email_authenticatable`, `:multi_email_confirmable` and `:multi_email_validatable` are provided by _devise-multi_email_.
|
|
10
10
|
|
|
11
11
|
## Getting Started
|
|
12
12
|
|
|
13
|
-
Add this line to your application's Gemfile
|
|
13
|
+
Add this line to your application's `Gemfile`, _devise-multi_email_ has been tested with Devise 4.0 and rails 4.2:
|
|
14
14
|
|
|
15
15
|
```ruby
|
|
16
16
|
gem 'devise-multi_email'
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
Suppose you have already setup
|
|
19
|
+
Suppose you have already setup Devise, your `User` model might look like this:
|
|
20
20
|
|
|
21
21
|
```ruby
|
|
22
22
|
class User < ActiveRecord::Base
|
|
@@ -24,7 +24,7 @@ class User < ActiveRecord::Base
|
|
|
24
24
|
end
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
In order to let your `User` support multiple emails, with
|
|
27
|
+
In order to let your `User` support multiple emails, with _devise-multi_email_ what you need to do is just:
|
|
28
28
|
|
|
29
29
|
```ruby
|
|
30
30
|
class User < ActiveRecord::Base
|
|
@@ -39,7 +39,8 @@ class Email < ActiveRecord::Base
|
|
|
39
39
|
end
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
Note that `:email` column should be moved from users table to the emails table, and a new `primary` boolean column should be added to the emails table (so that all the emails will be sent to the primary email, and `user.email` will give you the primary email address). Your emails table's migration should look like:
|
|
42
|
+
Note that the `:email` column should be moved from `users` table to the `emails` table, and a new `primary` boolean column should be added to the `emails` table (so that all the emails will be sent to the primary email, and `user.email` will give you the primary email address). Your `emails` table's migration should look like:
|
|
43
|
+
|
|
43
44
|
```ruby
|
|
44
45
|
create_table :emails do |t|
|
|
45
46
|
t.integer :user_id
|
|
@@ -48,20 +49,48 @@ create_table :emails do |t|
|
|
|
48
49
|
end
|
|
49
50
|
```
|
|
50
51
|
|
|
52
|
+
### Configure custom association names
|
|
53
|
+
|
|
54
|
+
You may not want to use the association `user.emails` or `email.users`. You can customize the name of the associations used. Add your custom configurations to an initializer file such as `config/initializers/devise-multi_email.rb`.
|
|
55
|
+
|
|
56
|
+
_Note: model classes are inferred from the associations._
|
|
57
|
+
|
|
58
|
+
```ruby
|
|
59
|
+
Devise::MultiEmail.configure do |config|
|
|
60
|
+
# Default is :user for Email model
|
|
61
|
+
config.parent_association_name = :team
|
|
62
|
+
# Default is :emails for parent (e.g. User) model
|
|
63
|
+
config.emails_association_name = :email_addresses
|
|
64
|
+
# For backwards-compatibility, specify :primary_email_record
|
|
65
|
+
# Default is :primary_email
|
|
66
|
+
config.primary_email_method_name = :primary_email_record
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Example use of custom association names
|
|
70
|
+
team = Team.first
|
|
71
|
+
emails = team.email_addresses
|
|
72
|
+
|
|
73
|
+
email = EmailAddress.first
|
|
74
|
+
team = email.team
|
|
75
|
+
```
|
|
76
|
+
|
|
51
77
|
## Confirmable with multiple emails
|
|
52
|
-
|
|
78
|
+
|
|
79
|
+
Sending separate confirmations to each email is supported. What you need to do is:
|
|
53
80
|
|
|
54
81
|
Declare `devise :multi_email_confirmable` in your `User` model:
|
|
82
|
+
|
|
55
83
|
```ruby
|
|
56
84
|
class User < ActiveRecord::Base
|
|
57
85
|
has_many :emails
|
|
58
86
|
|
|
59
|
-
# You should not declare :
|
|
87
|
+
# You should not declare :confirmable and :multi_email_confirmable at the same time.
|
|
60
88
|
devise :multi_email_authenticatable, :registerable, :multi_email_confirmable
|
|
61
89
|
end
|
|
62
90
|
```
|
|
63
91
|
|
|
64
|
-
Add `:confirmation_token`, `:confirmed_at` and `:confirmation_sent_at` to your emails table:
|
|
92
|
+
Add `:confirmation_token`, `:confirmed_at` and `:confirmation_sent_at` to your `emails` table:
|
|
93
|
+
|
|
65
94
|
```ruby
|
|
66
95
|
create_table :emails do |t|
|
|
67
96
|
t.integer :user_id
|
|
@@ -69,16 +98,18 @@ create_table :emails do |t|
|
|
|
69
98
|
t.boolean :primary, default: false
|
|
70
99
|
|
|
71
100
|
## Confirmable
|
|
72
|
-
t.string
|
|
101
|
+
t.string :unconfirmed_email
|
|
102
|
+
t.string :confirmation_token
|
|
73
103
|
t.datetime :confirmed_at
|
|
74
104
|
t.datetime :confirmation_sent_at
|
|
75
105
|
end
|
|
76
106
|
```
|
|
77
107
|
|
|
78
|
-
Then all the methods in
|
|
108
|
+
Then all the methods in Devise confirmable are available in your `Email` model. You can do `email#send_confirmation_instructions` for each of your email. And `user#send_confirmation_instructions` will be delegated to the primary email.
|
|
79
109
|
|
|
80
110
|
## Validatable with multiple emails
|
|
81
|
-
|
|
111
|
+
|
|
112
|
+
Declare `devise :multi_email_validatable` in the `User` model, then all the user emails will be validated:
|
|
82
113
|
|
|
83
114
|
```ruby
|
|
84
115
|
class User < ActiveRecord::Base
|
|
@@ -89,18 +120,39 @@ class User < ActiveRecord::Base
|
|
|
89
120
|
end
|
|
90
121
|
```
|
|
91
122
|
|
|
123
|
+
You can find the detailed configurations in the [rails 5 example app](https://github.com/allenwq/devise-multi_email/tree/master/examples/rails5_app).
|
|
124
|
+
|
|
125
|
+
## ActiveJob Integration
|
|
126
|
+
|
|
127
|
+
The [Devise README](https://github.com/plataformatec/devise#activejob-integration) describes how to use ActiveJob to deliver emails in the background. Normally you would place the following code in your `User` model, however when using _devise-multi_email_ you should place this in the `Email` model.
|
|
128
|
+
|
|
129
|
+
```ruby
|
|
130
|
+
# models/email.rb
|
|
131
|
+
def send_devise_notification(notification, *args)
|
|
132
|
+
devise_mailer.send(notification, self, *args).deliver_later
|
|
133
|
+
end
|
|
134
|
+
```
|
|
135
|
+
|
|
92
136
|
## What's more
|
|
93
137
|
|
|
94
|
-
The gem works with all other
|
|
138
|
+
The gem works with all other Devise modules as expected -- you don't need to add the "multi_email" prefix.
|
|
139
|
+
|
|
95
140
|
```ruby
|
|
96
|
-
|
|
141
|
+
class User < ActiveRecord::Base
|
|
142
|
+
devise :multi_email_authenticatable, :multi_email_confirmable, :multi_email_validatable, :lockable,
|
|
97
143
|
:recoverable, :registerable, :rememberable, :timeoutable, :trackable
|
|
144
|
+
end
|
|
98
145
|
```
|
|
99
146
|
|
|
100
147
|
## Issues
|
|
101
|
-
You need to implement add/delete emails for a user as well as set/unset primary email.
|
|
102
148
|
|
|
103
|
-
You
|
|
149
|
+
You need to implement add/delete emails for a user as well as set/unset "primary" for each email.
|
|
150
|
+
|
|
151
|
+
You can do `email.send_confirmation_instructions` for each email individually, but you need to handle that logic in some place (except for the primary email, which is handled by Devise by default). e.g. After a new email was added by a user, you might want to provide some buttons in the view to allow users to resend confirmation instructions for that email.
|
|
152
|
+
|
|
153
|
+
## Wiki
|
|
154
|
+
|
|
155
|
+
[Migrating exiting user records](https://github.com/allenwq/devise-multi_email/wiki/Migrating-existing-user-records)
|
|
104
156
|
|
|
105
157
|
## Development
|
|
106
158
|
|
|
@@ -116,4 +168,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
|
|
|
116
168
|
## License
|
|
117
169
|
|
|
118
170
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
|
119
|
-
|
data/devise-multi_email.gemspec
CHANGED
|
@@ -23,4 +23,8 @@ Gem::Specification.new do |spec|
|
|
|
23
23
|
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.10'
|
|
25
25
|
spec.add_development_dependency 'rake', '~> 10.0'
|
|
26
|
+
spec.add_development_dependency 'rspec'
|
|
27
|
+
spec.add_development_dependency 'sqlite3'
|
|
28
|
+
spec.add_development_dependency 'capybara'
|
|
29
|
+
spec.add_development_dependency 'coveralls'
|
|
26
30
|
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
|
|
2
|
+
#
|
|
3
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
|
4
|
+
# or operating system, you probably want to add a global ignore instead:
|
|
5
|
+
# git config --global core.excludesfile '~/.gitignore_global'
|
|
6
|
+
|
|
7
|
+
# Ignore bundler config.
|
|
8
|
+
/.bundle
|
|
9
|
+
|
|
10
|
+
# Ignore the default SQLite database.
|
|
11
|
+
/db/*.sqlite3
|
|
12
|
+
/db/*.sqlite3-journal
|
|
13
|
+
|
|
14
|
+
# Ignore all logfiles and tempfiles.
|
|
15
|
+
/log/*
|
|
16
|
+
/tmp/*
|
|
17
|
+
!/log/.keep
|
|
18
|
+
!/tmp/.keep
|
|
19
|
+
|
|
20
|
+
# Ignore Byebug command history file.
|
|
21
|
+
.byebug_history
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
git_source(:github) do |repo_name|
|
|
4
|
+
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
|
|
5
|
+
"https://github.com/#{repo_name}.git"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
|
|
10
|
+
gem 'rails', '~> 5.0.2'
|
|
11
|
+
# Use sqlite3 as the database for Active Record
|
|
12
|
+
gem 'sqlite3'
|
|
13
|
+
# Use Puma as the app server
|
|
14
|
+
gem 'puma', '~> 3.0'
|
|
15
|
+
# Use SCSS for stylesheets
|
|
16
|
+
gem 'sass-rails', '~> 5.0'
|
|
17
|
+
# Use Uglifier as compressor for JavaScript assets
|
|
18
|
+
gem 'uglifier', '>= 1.3.0'
|
|
19
|
+
# See https://github.com/rails/execjs#readme for more supported runtimes
|
|
20
|
+
# gem 'therubyracer', platforms: :ruby
|
|
21
|
+
|
|
22
|
+
# Use jquery as the JavaScript library
|
|
23
|
+
gem 'jquery-rails'
|
|
24
|
+
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
|
|
25
|
+
gem 'turbolinks', '~> 5'
|
|
26
|
+
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
|
27
|
+
gem 'jbuilder', '~> 2.5'
|
|
28
|
+
# Use Redis adapter to run Action Cable in production
|
|
29
|
+
# gem 'redis', '~> 3.0'
|
|
30
|
+
# Use ActiveModel has_secure_password
|
|
31
|
+
# gem 'bcrypt', '~> 3.1.7'
|
|
32
|
+
|
|
33
|
+
# Use Capistrano for deployment
|
|
34
|
+
# gem 'capistrano-rails', group: :development
|
|
35
|
+
|
|
36
|
+
group :development, :test do
|
|
37
|
+
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
|
|
38
|
+
gem 'byebug', platform: :mri
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
group :development do
|
|
42
|
+
# Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
|
|
43
|
+
gem 'web-console', '>= 3.3.0'
|
|
44
|
+
gem 'listen', '~> 3.0.5'
|
|
45
|
+
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
|
|
46
|
+
gem 'spring'
|
|
47
|
+
gem 'spring-watcher-listen', '~> 2.0.0'
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
|
51
|
+
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
|
|
52
|
+
|
|
53
|
+
gem 'devise'
|
|
54
|
+
gem 'devise-multi_email'
|
|
55
|
+
gem 'devise-encryptable'
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
GEM
|
|
2
|
+
remote: https://rubygems.org/
|
|
3
|
+
specs:
|
|
4
|
+
actioncable (5.0.2)
|
|
5
|
+
actionpack (= 5.0.2)
|
|
6
|
+
nio4r (>= 1.2, < 3.0)
|
|
7
|
+
websocket-driver (~> 0.6.1)
|
|
8
|
+
actionmailer (5.0.2)
|
|
9
|
+
actionpack (= 5.0.2)
|
|
10
|
+
actionview (= 5.0.2)
|
|
11
|
+
activejob (= 5.0.2)
|
|
12
|
+
mail (~> 2.5, >= 2.5.4)
|
|
13
|
+
rails-dom-testing (~> 2.0)
|
|
14
|
+
actionpack (5.0.2)
|
|
15
|
+
actionview (= 5.0.2)
|
|
16
|
+
activesupport (= 5.0.2)
|
|
17
|
+
rack (~> 2.0)
|
|
18
|
+
rack-test (~> 0.6.3)
|
|
19
|
+
rails-dom-testing (~> 2.0)
|
|
20
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
21
|
+
actionview (5.0.2)
|
|
22
|
+
activesupport (= 5.0.2)
|
|
23
|
+
builder (~> 3.1)
|
|
24
|
+
erubis (~> 2.7.0)
|
|
25
|
+
rails-dom-testing (~> 2.0)
|
|
26
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
|
27
|
+
activejob (5.0.2)
|
|
28
|
+
activesupport (= 5.0.2)
|
|
29
|
+
globalid (>= 0.3.6)
|
|
30
|
+
activemodel (5.0.2)
|
|
31
|
+
activesupport (= 5.0.2)
|
|
32
|
+
activerecord (5.0.2)
|
|
33
|
+
activemodel (= 5.0.2)
|
|
34
|
+
activesupport (= 5.0.2)
|
|
35
|
+
arel (~> 7.0)
|
|
36
|
+
activesupport (5.0.2)
|
|
37
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
38
|
+
i18n (~> 0.7)
|
|
39
|
+
minitest (~> 5.1)
|
|
40
|
+
tzinfo (~> 1.1)
|
|
41
|
+
arel (7.1.4)
|
|
42
|
+
bcrypt (3.1.11)
|
|
43
|
+
builder (3.2.3)
|
|
44
|
+
byebug (9.0.6)
|
|
45
|
+
concurrent-ruby (1.0.5)
|
|
46
|
+
debug_inspector (0.0.2)
|
|
47
|
+
devise (4.2.0)
|
|
48
|
+
bcrypt (~> 3.0)
|
|
49
|
+
orm_adapter (~> 0.1)
|
|
50
|
+
railties (>= 4.1.0, < 5.1)
|
|
51
|
+
responders
|
|
52
|
+
warden (~> 1.2.3)
|
|
53
|
+
devise-encryptable (0.2.0)
|
|
54
|
+
devise (>= 2.1.0)
|
|
55
|
+
devise-multi_email (1.0.5)
|
|
56
|
+
devise
|
|
57
|
+
erubis (2.7.0)
|
|
58
|
+
execjs (2.7.0)
|
|
59
|
+
ffi (1.9.18)
|
|
60
|
+
globalid (0.3.7)
|
|
61
|
+
activesupport (>= 4.1.0)
|
|
62
|
+
i18n (0.8.1)
|
|
63
|
+
jbuilder (2.6.3)
|
|
64
|
+
activesupport (>= 3.0.0, < 5.2)
|
|
65
|
+
multi_json (~> 1.2)
|
|
66
|
+
jquery-rails (4.2.2)
|
|
67
|
+
rails-dom-testing (>= 1, < 3)
|
|
68
|
+
railties (>= 4.2.0)
|
|
69
|
+
thor (>= 0.14, < 2.0)
|
|
70
|
+
listen (3.0.8)
|
|
71
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
|
72
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
|
73
|
+
loofah (2.0.3)
|
|
74
|
+
nokogiri (>= 1.5.9)
|
|
75
|
+
mail (2.6.4)
|
|
76
|
+
mime-types (>= 1.16, < 4)
|
|
77
|
+
method_source (0.8.2)
|
|
78
|
+
mime-types (3.1)
|
|
79
|
+
mime-types-data (~> 3.2015)
|
|
80
|
+
mime-types-data (3.2016.0521)
|
|
81
|
+
mini_portile2 (2.1.0)
|
|
82
|
+
minitest (5.10.1)
|
|
83
|
+
multi_json (1.12.1)
|
|
84
|
+
nio4r (2.0.0)
|
|
85
|
+
nokogiri (1.7.0.1)
|
|
86
|
+
mini_portile2 (~> 2.1.0)
|
|
87
|
+
orm_adapter (0.5.0)
|
|
88
|
+
puma (3.7.1)
|
|
89
|
+
rack (2.0.1)
|
|
90
|
+
rack-test (0.6.3)
|
|
91
|
+
rack (>= 1.0)
|
|
92
|
+
rails (5.0.2)
|
|
93
|
+
actioncable (= 5.0.2)
|
|
94
|
+
actionmailer (= 5.0.2)
|
|
95
|
+
actionpack (= 5.0.2)
|
|
96
|
+
actionview (= 5.0.2)
|
|
97
|
+
activejob (= 5.0.2)
|
|
98
|
+
activemodel (= 5.0.2)
|
|
99
|
+
activerecord (= 5.0.2)
|
|
100
|
+
activesupport (= 5.0.2)
|
|
101
|
+
bundler (>= 1.3.0, < 2.0)
|
|
102
|
+
railties (= 5.0.2)
|
|
103
|
+
sprockets-rails (>= 2.0.0)
|
|
104
|
+
rails-dom-testing (2.0.2)
|
|
105
|
+
activesupport (>= 4.2.0, < 6.0)
|
|
106
|
+
nokogiri (~> 1.6)
|
|
107
|
+
rails-html-sanitizer (1.0.3)
|
|
108
|
+
loofah (~> 2.0)
|
|
109
|
+
railties (5.0.2)
|
|
110
|
+
actionpack (= 5.0.2)
|
|
111
|
+
activesupport (= 5.0.2)
|
|
112
|
+
method_source
|
|
113
|
+
rake (>= 0.8.7)
|
|
114
|
+
thor (>= 0.18.1, < 2.0)
|
|
115
|
+
rake (12.0.0)
|
|
116
|
+
rb-fsevent (0.9.8)
|
|
117
|
+
rb-inotify (0.9.8)
|
|
118
|
+
ffi (>= 0.5.0)
|
|
119
|
+
responders (2.3.0)
|
|
120
|
+
railties (>= 4.2.0, < 5.1)
|
|
121
|
+
sass (3.4.23)
|
|
122
|
+
sass-rails (5.0.6)
|
|
123
|
+
railties (>= 4.0.0, < 6)
|
|
124
|
+
sass (~> 3.1)
|
|
125
|
+
sprockets (>= 2.8, < 4.0)
|
|
126
|
+
sprockets-rails (>= 2.0, < 4.0)
|
|
127
|
+
tilt (>= 1.1, < 3)
|
|
128
|
+
spring (2.0.1)
|
|
129
|
+
activesupport (>= 4.2)
|
|
130
|
+
spring-watcher-listen (2.0.1)
|
|
131
|
+
listen (>= 2.7, < 4.0)
|
|
132
|
+
spring (>= 1.2, < 3.0)
|
|
133
|
+
sprockets (3.7.1)
|
|
134
|
+
concurrent-ruby (~> 1.0)
|
|
135
|
+
rack (> 1, < 3)
|
|
136
|
+
sprockets-rails (3.2.0)
|
|
137
|
+
actionpack (>= 4.0)
|
|
138
|
+
activesupport (>= 4.0)
|
|
139
|
+
sprockets (>= 3.0.0)
|
|
140
|
+
sqlite3 (1.3.13)
|
|
141
|
+
thor (0.19.4)
|
|
142
|
+
thread_safe (0.3.6)
|
|
143
|
+
tilt (2.0.6)
|
|
144
|
+
turbolinks (5.0.1)
|
|
145
|
+
turbolinks-source (~> 5)
|
|
146
|
+
turbolinks-source (5.0.0)
|
|
147
|
+
tzinfo (1.2.2)
|
|
148
|
+
thread_safe (~> 0.1)
|
|
149
|
+
uglifier (3.1.4)
|
|
150
|
+
execjs (>= 0.3.0, < 3)
|
|
151
|
+
warden (1.2.7)
|
|
152
|
+
rack (>= 1.0)
|
|
153
|
+
web-console (3.4.0)
|
|
154
|
+
actionview (>= 5.0)
|
|
155
|
+
activemodel (>= 5.0)
|
|
156
|
+
debug_inspector
|
|
157
|
+
railties (>= 5.0)
|
|
158
|
+
websocket-driver (0.6.5)
|
|
159
|
+
websocket-extensions (>= 0.1.0)
|
|
160
|
+
websocket-extensions (0.1.2)
|
|
161
|
+
|
|
162
|
+
PLATFORMS
|
|
163
|
+
ruby
|
|
164
|
+
|
|
165
|
+
DEPENDENCIES
|
|
166
|
+
byebug
|
|
167
|
+
devise
|
|
168
|
+
devise-encryptable
|
|
169
|
+
devise-multi_email
|
|
170
|
+
jbuilder (~> 2.5)
|
|
171
|
+
jquery-rails
|
|
172
|
+
listen (~> 3.0.5)
|
|
173
|
+
puma (~> 3.0)
|
|
174
|
+
rails (~> 5.0.2)
|
|
175
|
+
sass-rails (~> 5.0)
|
|
176
|
+
spring
|
|
177
|
+
spring-watcher-listen (~> 2.0.0)
|
|
178
|
+
sqlite3
|
|
179
|
+
turbolinks (~> 5)
|
|
180
|
+
tzinfo-data
|
|
181
|
+
uglifier (>= 1.3.0)
|
|
182
|
+
web-console (>= 3.3.0)
|
|
183
|
+
|
|
184
|
+
BUNDLED WITH
|
|
185
|
+
1.13.6
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# README
|
|
2
|
+
|
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
|
4
|
+
application up and running.
|
|
5
|
+
|
|
6
|
+
Things you may want to cover:
|
|
7
|
+
|
|
8
|
+
* Ruby version
|
|
9
|
+
|
|
10
|
+
* System dependencies
|
|
11
|
+
|
|
12
|
+
* Configuration
|
|
13
|
+
|
|
14
|
+
* Database creation
|
|
15
|
+
|
|
16
|
+
* Database initialization
|
|
17
|
+
|
|
18
|
+
* How to run the test suite
|
|
19
|
+
|
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
|
21
|
+
|
|
22
|
+
* Deployment instructions
|
|
23
|
+
|
|
24
|
+
* ...
|
|
File without changes
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
|
2
|
+
// listed below.
|
|
3
|
+
//
|
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
|
6
|
+
//
|
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
|
8
|
+
// compiled file. JavaScript code in this file should be added after the last require_* statement.
|
|
9
|
+
//
|
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
|
11
|
+
// about supported directives.
|
|
12
|
+
//
|
|
13
|
+
//= require jquery
|
|
14
|
+
//= require jquery_ujs
|
|
15
|
+
//= require turbolinks
|
|
16
|
+
//= require_tree .
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Action Cable provides the framework to deal with WebSockets in Rails.
|
|
2
|
+
// You can generate new channels where WebSocket features live using the rails generate channel command.
|
|
3
|
+
//
|
|
4
|
+
//= require action_cable
|
|
5
|
+
//= require_self
|
|
6
|
+
//= require_tree ./channels
|
|
7
|
+
|
|
8
|
+
(function() {
|
|
9
|
+
this.App || (this.App = {});
|
|
10
|
+
|
|
11
|
+
App.cable = ActionCable.createConsumer();
|
|
12
|
+
|
|
13
|
+
}).call(this);
|
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
|
3
|
+
* listed below.
|
|
4
|
+
*
|
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
|
7
|
+
*
|
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
|
11
|
+
* It is generally better to create a new file per style scope.
|
|
12
|
+
*
|
|
13
|
+
*= require_tree .
|
|
14
|
+
*= require_self
|
|
15
|
+
*/
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class User < ApplicationRecord
|
|
2
|
+
has_many :emails
|
|
3
|
+
# Include default devise modules. Others available are:
|
|
4
|
+
# :lockable, :timeoutable and :omniauthable
|
|
5
|
+
devise :multi_email_authenticatable, :multi_email_confirmable, :multi_email_validatable,
|
|
6
|
+
:recoverable, :registerable, :rememberable, :trackable,
|
|
7
|
+
# Below are for testing purpose, not required by default
|
|
8
|
+
:encryptable, encryptor: :sha512
|
|
9
|
+
end
|