devise 4.5.0 → 4.9.2

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.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +137 -3
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +125 -60
  5. data/app/controllers/devise/confirmations_controller.rb +1 -0
  6. data/app/controllers/devise/passwords_controller.rb +3 -2
  7. data/app/controllers/devise/registrations_controller.rb +26 -8
  8. data/app/controllers/devise/sessions_controller.rb +1 -1
  9. data/app/controllers/devise/unlocks_controller.rb +1 -0
  10. data/app/controllers/devise_controller.rb +3 -2
  11. data/app/helpers/devise_helper.rb +21 -18
  12. data/app/mailers/devise/mailer.rb +5 -5
  13. data/app/views/devise/confirmations/new.html.erb +1 -1
  14. data/app/views/devise/passwords/edit.html.erb +2 -2
  15. data/app/views/devise/passwords/new.html.erb +1 -1
  16. data/app/views/devise/registrations/edit.html.erb +2 -2
  17. data/app/views/devise/registrations/new.html.erb +1 -1
  18. data/app/views/devise/sessions/new.html.erb +2 -2
  19. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  20. data/app/views/devise/shared/_links.html.erb +8 -8
  21. data/app/views/devise/unlocks/new.html.erb +1 -1
  22. data/config/locales/en.yml +3 -2
  23. data/lib/devise/controllers/helpers.rb +8 -8
  24. data/lib/devise/controllers/responder.rb +35 -0
  25. data/lib/devise/controllers/sign_in_out.rb +6 -4
  26. data/lib/devise/controllers/url_helpers.rb +1 -1
  27. data/lib/devise/failure_app.rb +29 -7
  28. data/lib/devise/hooks/csrf_cleaner.rb +6 -1
  29. data/lib/devise/hooks/lockable.rb +2 -5
  30. data/lib/devise/hooks/timeoutable.rb +2 -2
  31. data/lib/devise/mapping.rb +1 -1
  32. data/lib/devise/models/authenticatable.rb +20 -24
  33. data/lib/devise/models/confirmable.rb +34 -40
  34. data/lib/devise/models/database_authenticatable.rb +47 -28
  35. data/lib/devise/models/lockable.rb +13 -5
  36. data/lib/devise/models/omniauthable.rb +2 -2
  37. data/lib/devise/models/recoverable.rb +8 -19
  38. data/lib/devise/models/registerable.rb +2 -0
  39. data/lib/devise/models/rememberable.rb +2 -2
  40. data/lib/devise/models/timeoutable.rb +1 -1
  41. data/lib/devise/models/trackable.rb +1 -1
  42. data/lib/devise/models/validatable.rb +4 -9
  43. data/lib/devise/models.rb +1 -0
  44. data/lib/devise/omniauth.rb +2 -5
  45. data/lib/devise/orm.rb +71 -0
  46. data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
  47. data/lib/devise/rails/routes.rb +6 -6
  48. data/lib/devise/strategies/authenticatable.rb +1 -1
  49. data/lib/devise/strategies/database_authenticatable.rb +3 -0
  50. data/lib/devise/test/controller_helpers.rb +4 -2
  51. data/lib/devise/test/integration_helpers.rb +1 -1
  52. data/lib/devise/version.rb +1 -1
  53. data/lib/devise.rb +34 -11
  54. data/lib/generators/active_record/devise_generator.rb +21 -6
  55. data/lib/generators/devise/controllers_generator.rb +1 -1
  56. data/lib/generators/devise/devise_generator.rb +1 -1
  57. data/lib/generators/devise/install_generator.rb +1 -5
  58. data/lib/generators/devise/views_generator.rb +1 -1
  59. data/lib/generators/templates/README +9 -1
  60. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +1 -1
  61. data/lib/generators/templates/devise.rb +37 -14
  62. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +4 -1
  63. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +2 -2
  64. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +1 -1
  65. metadata +23 -318
  66. data/.gitignore +0 -10
  67. data/.travis.yml +0 -69
  68. data/.yardopts +0 -9
  69. data/CODE_OF_CONDUCT.md +0 -22
  70. data/CONTRIBUTING.md +0 -79
  71. data/Gemfile +0 -39
  72. data/Gemfile.lock +0 -202
  73. data/ISSUE_TEMPLATE.md +0 -19
  74. data/Rakefile +0 -37
  75. data/bin/test +0 -13
  76. data/devise.gemspec +0 -28
  77. data/devise.png +0 -0
  78. data/gemfiles/Gemfile.rails-4.1-stable +0 -32
  79. data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -171
  80. data/gemfiles/Gemfile.rails-4.2-stable +0 -32
  81. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -192
  82. data/gemfiles/Gemfile.rails-5.0-stable +0 -33
  83. data/gemfiles/Gemfile.rails-5.0-stable.lock +0 -192
  84. data/gemfiles/Gemfile.rails-5.2-rc1 +0 -26
  85. data/gemfiles/Gemfile.rails-5.2-rc1.lock +0 -201
  86. data/guides/bug_report_templates/integration_test.rb +0 -106
  87. data/test/controllers/custom_registrations_controller_test.rb +0 -42
  88. data/test/controllers/custom_strategy_test.rb +0 -66
  89. data/test/controllers/helper_methods_test.rb +0 -24
  90. data/test/controllers/helpers_test.rb +0 -318
  91. data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -53
  92. data/test/controllers/internal_helpers_test.rb +0 -129
  93. data/test/controllers/load_hooks_controller_test.rb +0 -21
  94. data/test/controllers/passwords_controller_test.rb +0 -34
  95. data/test/controllers/sessions_controller_test.rb +0 -108
  96. data/test/controllers/url_helpers_test.rb +0 -67
  97. data/test/delegator_test.rb +0 -21
  98. data/test/devise_test.rb +0 -109
  99. data/test/failure_app_test.rb +0 -346
  100. data/test/generators/active_record_generator_test.rb +0 -130
  101. data/test/generators/controllers_generator_test.rb +0 -50
  102. data/test/generators/devise_generator_test.rb +0 -41
  103. data/test/generators/install_generator_test.rb +0 -26
  104. data/test/generators/mongoid_generator_test.rb +0 -25
  105. data/test/generators/views_generator_test.rb +0 -105
  106. data/test/helpers/devise_helper_test.rb +0 -51
  107. data/test/integration/authenticatable_test.rb +0 -706
  108. data/test/integration/confirmable_test.rb +0 -326
  109. data/test/integration/database_authenticatable_test.rb +0 -110
  110. data/test/integration/http_authenticatable_test.rb +0 -114
  111. data/test/integration/lockable_test.rb +0 -242
  112. data/test/integration/mounted_engine_test.rb +0 -38
  113. data/test/integration/omniauthable_test.rb +0 -148
  114. data/test/integration/recoverable_test.rb +0 -349
  115. data/test/integration/registerable_test.rb +0 -365
  116. data/test/integration/rememberable_test.rb +0 -219
  117. data/test/integration/timeoutable_test.rb +0 -186
  118. data/test/integration/trackable_test.rb +0 -99
  119. data/test/mailers/confirmation_instructions_test.rb +0 -117
  120. data/test/mailers/email_changed_test.rb +0 -132
  121. data/test/mailers/mailer_test.rb +0 -20
  122. data/test/mailers/reset_password_instructions_test.rb +0 -98
  123. data/test/mailers/unlock_instructions_test.rb +0 -93
  124. data/test/mapping_test.rb +0 -136
  125. data/test/models/authenticatable_test.rb +0 -25
  126. data/test/models/confirmable_test.rb +0 -549
  127. data/test/models/database_authenticatable_test.rb +0 -290
  128. data/test/models/lockable_test.rb +0 -352
  129. data/test/models/omniauthable_test.rb +0 -9
  130. data/test/models/recoverable_test.rb +0 -263
  131. data/test/models/registerable_test.rb +0 -9
  132. data/test/models/rememberable_test.rb +0 -184
  133. data/test/models/serializable_test.rb +0 -60
  134. data/test/models/timeoutable_test.rb +0 -53
  135. data/test/models/trackable_test.rb +0 -80
  136. data/test/models/validatable_test.rb +0 -121
  137. data/test/models_test.rb +0 -155
  138. data/test/omniauth/config_test.rb +0 -61
  139. data/test/omniauth/url_helpers_test.rb +0 -53
  140. data/test/orm/active_record.rb +0 -24
  141. data/test/orm/mongoid.rb +0 -15
  142. data/test/parameter_sanitizer_test.rb +0 -105
  143. data/test/rails_app/Rakefile +0 -6
  144. data/test/rails_app/app/active_record/admin.rb +0 -8
  145. data/test/rails_app/app/active_record/shim.rb +0 -4
  146. data/test/rails_app/app/active_record/user.rb +0 -20
  147. data/test/rails_app/app/active_record/user_on_engine.rb +0 -9
  148. data/test/rails_app/app/active_record/user_on_main_app.rb +0 -9
  149. data/test/rails_app/app/active_record/user_with_validations.rb +0 -12
  150. data/test/rails_app/app/active_record/user_without_email.rb +0 -10
  151. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -8
  152. data/test/rails_app/app/controllers/admins_controller.rb +0 -8
  153. data/test/rails_app/app/controllers/application_controller.rb +0 -13
  154. data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -32
  155. data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -33
  156. data/test/rails_app/app/controllers/home_controller.rb +0 -31
  157. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -4
  158. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -4
  159. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -16
  160. data/test/rails_app/app/controllers/users_controller.rb +0 -33
  161. data/test/rails_app/app/helpers/application_helper.rb +0 -5
  162. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -5
  163. data/test/rails_app/app/mailers/users/mailer.rb +0 -5
  164. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -6
  165. data/test/rails_app/app/mongoid/admin.rb +0 -31
  166. data/test/rails_app/app/mongoid/shim.rb +0 -25
  167. data/test/rails_app/app/mongoid/user.rb +0 -50
  168. data/test/rails_app/app/mongoid/user_on_engine.rb +0 -41
  169. data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -41
  170. data/test/rails_app/app/mongoid/user_with_validations.rb +0 -37
  171. data/test/rails_app/app/mongoid/user_without_email.rb +0 -35
  172. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  173. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  174. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  175. data/test/rails_app/app/views/home/index.html.erb +0 -1
  176. data/test/rails_app/app/views/home/join.html.erb +0 -1
  177. data/test/rails_app/app/views/home/private.html.erb +0 -1
  178. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  179. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  180. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  181. data/test/rails_app/app/views/users/index.html.erb +0 -1
  182. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  183. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  184. data/test/rails_app/bin/bundle +0 -3
  185. data/test/rails_app/bin/rails +0 -4
  186. data/test/rails_app/bin/rake +0 -4
  187. data/test/rails_app/config/application.rb +0 -48
  188. data/test/rails_app/config/boot.rb +0 -27
  189. data/test/rails_app/config/database.yml +0 -18
  190. data/test/rails_app/config/environment.rb +0 -7
  191. data/test/rails_app/config/environments/development.rb +0 -32
  192. data/test/rails_app/config/environments/production.rb +0 -88
  193. data/test/rails_app/config/environments/test.rb +0 -47
  194. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -9
  195. data/test/rails_app/config/initializers/devise.rb +0 -187
  196. data/test/rails_app/config/initializers/inflections.rb +0 -4
  197. data/test/rails_app/config/initializers/secret_token.rb +0 -5
  198. data/test/rails_app/config/initializers/session_store.rb +0 -3
  199. data/test/rails_app/config/routes.rb +0 -128
  200. data/test/rails_app/config.ru +0 -4
  201. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -77
  202. data/test/rails_app/db/schema.rb +0 -57
  203. data/test/rails_app/lib/lazy_load_test_module.rb +0 -5
  204. data/test/rails_app/lib/shared_admin.rb +0 -23
  205. data/test/rails_app/lib/shared_user.rb +0 -32
  206. data/test/rails_app/lib/shared_user_without_email.rb +0 -28
  207. data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -15
  208. data/test/rails_app/public/404.html +0 -26
  209. data/test/rails_app/public/422.html +0 -26
  210. data/test/rails_app/public/500.html +0 -26
  211. data/test/rails_app/public/favicon.ico +0 -0
  212. data/test/rails_test.rb +0 -11
  213. data/test/routes_test.rb +0 -281
  214. data/test/secret_key_finder_test.rb +0 -121
  215. data/test/support/action_controller/record_identifier.rb +0 -12
  216. data/test/support/assertions.rb +0 -30
  217. data/test/support/helpers.rb +0 -83
  218. data/test/support/http_method_compatibility.rb +0 -53
  219. data/test/support/integration.rb +0 -95
  220. data/test/support/locale/en.yml +0 -8
  221. data/test/support/mongoid.yml +0 -6
  222. data/test/support/webrat/integrations/rails.rb +0 -35
  223. data/test/test/controller_helpers_test.rb +0 -193
  224. data/test/test/integration_helpers_test.rb +0 -34
  225. data/test/test_helper.rb +0 -36
  226. data/test/test_models.rb +0 -35
@@ -1,93 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class UnlockInstructionsTest < ActionMailer::TestCase
6
-
7
- def setup
8
- setup_mailer
9
- Devise.mailer = 'Devise::Mailer'
10
- Devise.mailer_sender = 'test@example.com'
11
- end
12
-
13
- def teardown
14
- Devise.mailer = 'Devise::Mailer'
15
- Devise.mailer_sender = 'please-change-me@config-initializers-devise.com'
16
- end
17
-
18
- def user
19
- @user ||= begin
20
- user = create_user
21
- user.lock_access!
22
- user
23
- end
24
- end
25
-
26
- def mail
27
- @mail ||= begin
28
- user
29
- ActionMailer::Base.deliveries.last
30
- end
31
- end
32
-
33
- test 'email sent after locking the user' do
34
- assert_not_nil mail
35
- end
36
-
37
- test 'content type should be set to html' do
38
- assert mail.content_type.include?('text/html')
39
- end
40
-
41
- test 'send unlock instructions to the user email' do
42
- assert_equal [user.email], mail.to
43
- end
44
-
45
- test 'set up sender from configuration' do
46
- assert_equal ['test@example.com'], mail.from
47
- end
48
-
49
- test 'set up sender from custom mailer defaults' do
50
- Devise.mailer = 'Users::Mailer'
51
- assert_equal ['custom@example.com'], mail.from
52
- end
53
-
54
- test 'set up sender from custom mailer defaults with proc' do
55
- Devise.mailer = 'Users::FromProcMailer'
56
- assert_equal ['custom@example.com'], mail.from
57
- end
58
-
59
- test 'custom mailer renders parent mailer template' do
60
- Devise.mailer = 'Users::Mailer'
61
- assert_present mail.body.encoded
62
- end
63
-
64
- test 'set up reply to as copy from sender' do
65
- assert_equal ['test@example.com'], mail.reply_to
66
- end
67
-
68
- test 'set up subject from I18n' do
69
- store_translations :en, devise: { mailer: { unlock_instructions: { subject: 'Yo unlock instructions' } } } do
70
- assert_equal 'Yo unlock instructions', mail.subject
71
- end
72
- end
73
-
74
- test 'subject namespaced by model' do
75
- store_translations :en, devise: { mailer: { unlock_instructions: { user_subject: 'User Unlock Instructions' } } } do
76
- assert_equal 'User Unlock Instructions', mail.subject
77
- end
78
- end
79
-
80
- test 'body should have user info' do
81
- assert_match user.email, mail.body.encoded
82
- end
83
-
84
- test 'body should have link to unlock the account' do
85
- host, port = ActionMailer::Base.default_url_options.values_at :host, :port
86
-
87
- if mail.body.encoded =~ %r{<a href=\"http://#{host}:#{port}/users/unlock\?unlock_token=([^"]+)">}
88
- assert_equal Devise.token_generator.digest(user.class, :unlock_token, $1), user.unlock_token
89
- else
90
- flunk "expected unlock url regex to match"
91
- end
92
- end
93
- end
data/test/mapping_test.rb DELETED
@@ -1,136 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class FakeRequest < Struct.new(:path_info, :params)
6
- end
7
-
8
- class MappingTest < ActiveSupport::TestCase
9
- def fake_request(path, params={})
10
- FakeRequest.new(path, params)
11
- end
12
-
13
- test 'store options' do
14
- mapping = Devise.mappings[:user]
15
- assert_equal User, mapping.to
16
- assert_equal User.devise_modules, mapping.modules
17
- assert_equal "users", mapping.scoped_path
18
- assert_equal :user, mapping.singular
19
- assert_equal "users", mapping.path
20
- assert_equal "/users", mapping.fullpath
21
- end
22
-
23
- test 'store options with namespace' do
24
- mapping = Devise.mappings[:publisher_account]
25
- assert_equal Admin, mapping.to
26
- assert_equal "publisher/accounts", mapping.scoped_path
27
- assert_equal :publisher_account, mapping.singular
28
- assert_equal "accounts", mapping.path
29
- assert_equal "/publisher/accounts", mapping.fullpath
30
- end
31
-
32
- test 'allows path to be given' do
33
- assert_equal "admin_area", Devise.mappings[:admin].path
34
- end
35
-
36
- test 'allows to skip all routes' do
37
- assert_equal [], Devise.mappings[:skip_admin].used_routes
38
- end
39
-
40
- test 'sign_out_via defaults to :delete' do
41
- assert_equal :delete, Devise.mappings[:user].sign_out_via
42
- end
43
-
44
- test 'allows custom sign_out_via to be given' do
45
- assert_equal :delete, Devise.mappings[:sign_out_via_delete].sign_out_via
46
- assert_equal :post, Devise.mappings[:sign_out_via_post].sign_out_via
47
- assert_equal [:delete, :post], Devise.mappings[:sign_out_via_delete_or_post].sign_out_via
48
- end
49
-
50
- test 'allows custom singular to be given' do
51
- assert_equal "accounts", Devise.mappings[:manager].path
52
- end
53
-
54
- test 'has strategies depending on the model declaration' do
55
- assert_equal [:rememberable, :database_authenticatable], Devise.mappings[:user].strategies
56
- assert_equal [:database_authenticatable], Devise.mappings[:admin].strategies
57
- end
58
-
59
- test 'has no input strategies depending on the model declaration' do
60
- assert_equal [:rememberable], Devise.mappings[:user].no_input_strategies
61
- assert_equal [], Devise.mappings[:admin].no_input_strategies
62
- end
63
-
64
- test 'find scope for a given object' do
65
- assert_equal :user, Devise::Mapping.find_scope!(User)
66
- assert_equal :user, Devise::Mapping.find_scope!(:user)
67
- assert_equal :user, Devise::Mapping.find_scope!("user")
68
- assert_equal :user, Devise::Mapping.find_scope!(User.new)
69
- end
70
-
71
- test 'find scope works with single table inheritance' do
72
- assert_equal :user, Devise::Mapping.find_scope!(Class.new(User))
73
- assert_equal :user, Devise::Mapping.find_scope!(Class.new(User).new)
74
- end
75
-
76
- test 'find scope uses devise_scope' do
77
- user = User.new
78
- def user.devise_scope; :special_scope; end
79
- assert_equal :special_scope, Devise::Mapping.find_scope!(user)
80
- end
81
-
82
- test 'find scope raises an error if cannot be found' do
83
- assert_raise RuntimeError do
84
- Devise::Mapping.find_scope!(String)
85
- end
86
- end
87
-
88
- test 'return default path names' do
89
- mapping = Devise.mappings[:user]
90
- assert_equal 'sign_in', mapping.path_names[:sign_in]
91
- assert_equal 'sign_out', mapping.path_names[:sign_out]
92
- assert_equal 'password', mapping.path_names[:password]
93
- assert_equal 'confirmation', mapping.path_names[:confirmation]
94
- assert_equal 'sign_up', mapping.path_names[:sign_up]
95
- assert_equal 'unlock', mapping.path_names[:unlock]
96
- end
97
-
98
- test 'allow custom path names to be given' do
99
- mapping = Devise.mappings[:manager]
100
- assert_equal 'login', mapping.path_names[:sign_in]
101
- assert_equal 'logout', mapping.path_names[:sign_out]
102
- assert_equal 'secret', mapping.path_names[:password]
103
- assert_equal 'verification', mapping.path_names[:confirmation]
104
- assert_equal 'register', mapping.path_names[:sign_up]
105
- assert_equal 'unblock', mapping.path_names[:unlock]
106
- end
107
-
108
- test 'magic predicates' do
109
- mapping = Devise.mappings[:user]
110
- assert mapping.authenticatable?
111
- assert mapping.confirmable?
112
- assert mapping.recoverable?
113
- assert mapping.rememberable?
114
- assert mapping.registerable?
115
-
116
- mapping = Devise.mappings[:admin]
117
- assert mapping.authenticatable?
118
- assert mapping.recoverable?
119
- assert mapping.lockable?
120
- refute mapping.omniauthable?
121
- end
122
-
123
- test 'find mapping by path' do
124
- assert_raise RuntimeError do
125
- Devise::Mapping.find_by_path!('/accounts/facebook/callback')
126
- end
127
-
128
- assert_nothing_raised do
129
- Devise::Mapping.find_by_path!('/:locale/accounts/login')
130
- end
131
-
132
- assert_nothing_raised do
133
- Devise::Mapping.find_by_path!('/accounts/facebook/callback', :path)
134
- end
135
- end
136
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class AuthenticatableTest < ActiveSupport::TestCase
6
- test 'required_fields should be an empty array' do
7
- assert_equal Devise::Models::Validatable.required_fields(User), []
8
- end
9
-
10
- test 'find_first_by_auth_conditions allows custom filtering parameters' do
11
- user = User.create!(email: "example@example.com", password: "1234567")
12
- assert_equal User.find_first_by_auth_conditions({ email: "example@example.com" }), user
13
- assert_nil User.find_first_by_auth_conditions({ email: "example@example.com" }, id: user.id.to_s.next)
14
- end
15
-
16
- if defined?(ActionController::Parameters)
17
- test 'does not passes an ActionController::Parameters to find_first_by_auth_conditions through find_or_initialize_with_errors' do
18
- user = create_user(email: 'example@example.com')
19
- attributes = ActionController::Parameters.new(email: 'example@example.com')
20
-
21
- User.expects(:find_first_by_auth_conditions).with('email' => 'example@example.com').returns(user)
22
- User.find_or_initialize_with_errors([:email], attributes)
23
- end
24
- end
25
- end