authkit 0.4.0 → 0.5.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/README.md +0 -3
- data/Rakefile +3 -2
- data/lib/authkit/version.rb +1 -1
- data/lib/generators/authkit/install_generator.rb +181 -35
- data/lib/generators/authkit/templates/app/controllers/application_controller.rb +6 -0
- data/lib/generators/authkit/templates/app/controllers/auths_controller.rb +144 -0
- data/lib/generators/authkit/templates/app/controllers/email_confirmation_controller.rb +1 -1
- data/lib/generators/authkit/templates/app/controllers/password_reset_controller.rb +7 -1
- data/lib/generators/authkit/templates/app/controllers/sessions_controller.rb +11 -2
- data/lib/generators/authkit/templates/app/controllers/signup_controller.rb +4 -2
- data/lib/generators/authkit/templates/app/controllers/upload_controller.rb +78 -0
- data/lib/generators/authkit/templates/app/controllers/users_controller.rb +2 -2
- data/lib/generators/authkit/templates/app/forms/signup.rb +57 -7
- data/lib/generators/authkit/templates/app/helpers/auths_helper.rb +26 -0
- data/lib/generators/authkit/templates/app/helpers/upload_helper.rb +118 -0
- data/lib/generators/authkit/templates/app/models/auth.rb +81 -0
- data/lib/generators/authkit/templates/app/models/avatar.rb +45 -0
- data/lib/generators/authkit/templates/app/models/user.rb +53 -26
- data/lib/generators/authkit/templates/app/views/auths/connect.html.erb +34 -0
- data/lib/generators/authkit/templates/app/views/password_change/show.html.erb +9 -9
- data/lib/generators/authkit/templates/app/views/password_reset/show.html.erb +6 -6
- data/lib/generators/authkit/templates/app/views/sessions/new.html.erb +25 -7
- data/lib/generators/authkit/templates/app/views/signup/new.html.erb +44 -32
- data/lib/generators/authkit/templates/app/views/users/complete.html.erb +39 -0
- data/lib/generators/authkit/templates/app/views/users/edit.html.erb +31 -31
- data/lib/generators/authkit/templates/app/workers/avatar_import_worker.rb +12 -0
- data/lib/generators/authkit/templates/config/initializers/filter_parameter_logging.rb +2 -2
- data/lib/generators/authkit/templates/config/initializers/omniauth.rb +59 -0
- data/lib/generators/authkit/templates/config/initializers/paperclip.rb +68 -0
- data/lib/generators/authkit/templates/db/migrate/add_authkit_fields_to_users.rb +8 -6
- data/lib/generators/authkit/templates/db/migrate/create_auths.rb +24 -0
- data/lib/generators/authkit/templates/db/migrate/create_avatars.rb +27 -0
- data/lib/generators/authkit/templates/lib/full_name_splitter.rb +111 -0
- data/lib/generators/authkit/templates/lib/username_format_validator.rb +11 -0
- data/lib/generators/authkit/templates/spec/controllers/application_controller_spec.rb +31 -38
- data/lib/generators/authkit/templates/spec/controllers/auths_controller_spec.rb +72 -0
- data/lib/generators/authkit/templates/spec/controllers/email_confirmation_controller_spec.rb +25 -27
- data/lib/generators/authkit/templates/spec/controllers/password_change_controller_spec.rb +30 -30
- data/lib/generators/authkit/templates/spec/controllers/password_reset_controller_spec.rb +20 -20
- data/lib/generators/authkit/templates/spec/controllers/sessions_controller_spec.rb +33 -33
- data/lib/generators/authkit/templates/spec/controllers/signup_controller_spec.rb +19 -19
- data/lib/generators/authkit/templates/spec/controllers/users_controller_spec.rb +21 -21
- data/lib/generators/authkit/templates/spec/factories/user.rb +3 -3
- data/lib/generators/authkit/templates/spec/forms/signup_spec.rb +32 -31
- data/lib/generators/authkit/templates/spec/models/auth_spec.rb +18 -0
- data/lib/generators/authkit/templates/spec/models/user_spec.rb +72 -78
- data/spec/rails_helper.rb +50 -0
- data/spec/spec_helper.rb +70 -13
- metadata +35 -17
- data/lib/generators/authkit/templates/spec/spec_helper.rb +0 -4
@@ -0,0 +1,45 @@
|
|
1
|
+
class Avatar < ActiveRecord::Base
|
2
|
+
# Avatar images are publicly available (you can share the URL and it won't
|
3
|
+
# expire, but you probably can't guess it). Also, the images should be
|
4
|
+
# cached on the client side as the path name includes a hash.
|
5
|
+
has_attached_file :attachment,
|
6
|
+
styles: {thumb: "200x200#"},
|
7
|
+
s3_permissions: 'public-read',
|
8
|
+
s3_headers: {"Cache-Control" => "max-age=#{1.year.to_i}", "Expires" => 1.year.from_now.httpdate}
|
9
|
+
|
10
|
+
before_validation :prepare_import
|
11
|
+
validates :attachment, attachment_presence: true, unless: :attachment_importing?
|
12
|
+
after_save :async_import
|
13
|
+
|
14
|
+
def as_json(options = {})
|
15
|
+
super({
|
16
|
+
methods: [:url]
|
17
|
+
}.merge(options))
|
18
|
+
end
|
19
|
+
|
20
|
+
def url
|
21
|
+
self.attachment.url(:thumb)
|
22
|
+
end
|
23
|
+
|
24
|
+
def import!
|
25
|
+
return false unless self.attachment_importing?
|
26
|
+
self.attachment_importing = false
|
27
|
+
if self.remote_url.present?
|
28
|
+
uri = URI.parse(self.remote_url)
|
29
|
+
self.attachment = uri
|
30
|
+
self.attachment_file_name = File.basename(URI.decode(uri.path))
|
31
|
+
end
|
32
|
+
self.save
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
def prepare_import
|
38
|
+
return unless self.remote_url.present? && self.remote_url_changed?
|
39
|
+
self.attachment_importing = true
|
40
|
+
end
|
41
|
+
|
42
|
+
def async_import
|
43
|
+
AvatarImportWorker.perform_async(self.id) if self.attachment_importing?
|
44
|
+
end
|
45
|
+
end
|
@@ -1,37 +1,49 @@
|
|
1
1
|
require 'email_format_validator'
|
2
|
-
|
2
|
+
require 'full_name_splitter'
|
3
|
+
<% if username? %>require 'username_format_validator'
|
4
|
+
<% end %>
|
3
5
|
class User < ActiveRecord::Base
|
4
|
-
|
5
|
-
|
6
|
+
<% if oauth? %>
|
7
|
+
has_many :auths
|
8
|
+
<% end %>
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
# attr_accessible :username,
|
11
|
-
# :email,
|
12
|
-
# :confirmation_email,
|
13
|
-
# :password,
|
14
|
-
# :password_confirmation,
|
15
|
-
# :time_zone,
|
16
|
-
# :first_name,
|
17
|
-
# :last_name,
|
18
|
-
# :bio,
|
19
|
-
# :website,
|
20
|
-
# :phone_number
|
10
|
+
has_secure_password validations: false
|
11
|
+
has_one_time_password
|
21
12
|
|
22
13
|
before_validation :downcase_email
|
23
14
|
before_validation :set_confirmation_email
|
24
15
|
|
25
|
-
|
26
|
-
validates :
|
27
|
-
validates :
|
28
|
-
validates :
|
29
|
-
|
30
|
-
|
16
|
+
validates :password, confirmation: true, length: { minimum: 6 }, if: :has_password?
|
17
|
+
validates :email, email_format: true, uniqueness: { allow_nil: true }
|
18
|
+
validates :confirmation_email, email_format: true
|
19
|
+
<% if username? %>validates :username, username_format: true, uniqueness: { case_sensitive: false, allow_nil: true }
|
20
|
+
<% end %>
|
21
|
+
validates :password, presence: true, unless: :has_auth_or_skip_password_validation?
|
22
|
+
validates :email, presence: true, unless: :has_auth?
|
23
|
+
validates :confirmation_email, presence: true, unless: :has_auth?
|
24
|
+
<% if username? %>validates :username, presence: true, unless: :has_auth?
|
25
|
+
<% end %>
|
31
26
|
# Confirm emails check for existing emails for uniqueness as a convenience
|
32
27
|
validate :confirmation_email_uniqueness, if: :confirmation_email_set?
|
33
28
|
|
34
|
-
def
|
29
|
+
def suspended?
|
30
|
+
self.suspended_at.present?
|
31
|
+
end
|
32
|
+
|
33
|
+
def incomplete?
|
34
|
+
<% if username? %>username.blank? || <% end %>email.blank? || password_digest.blank?
|
35
|
+
end
|
36
|
+
|
37
|
+
def full_name=(value)
|
38
|
+
return if value.blank?
|
39
|
+
|
40
|
+
splitter = FullNameSplitter.new(value)
|
41
|
+
self.first_name = splitter.first_name
|
42
|
+
self.last_name = splitter.last_name
|
43
|
+
self.full_name
|
44
|
+
end
|
45
|
+
|
46
|
+
def full_name
|
35
47
|
[first_name, last_name].compact.join(" ")
|
36
48
|
end
|
37
49
|
|
@@ -141,7 +153,23 @@ class User < ActiveRecord::Base
|
|
141
153
|
|
142
154
|
protected
|
143
155
|
|
144
|
-
def
|
156
|
+
def has_auth?
|
157
|
+
<% if oauth? %>
|
158
|
+
self.auths.first.present?
|
159
|
+
<% else %>
|
160
|
+
false
|
161
|
+
<% end %>
|
162
|
+
end
|
163
|
+
|
164
|
+
def has_auth_or_skip_password_validation?
|
165
|
+
has_auth? || skip_password_validation?
|
166
|
+
end
|
167
|
+
|
168
|
+
def skip_password_validation?
|
169
|
+
self.password.blank? && self.password_digest.present?
|
170
|
+
end
|
171
|
+
|
172
|
+
def has_password?
|
145
173
|
self.password.present?
|
146
174
|
end
|
147
175
|
|
@@ -167,5 +195,4 @@ class User < ActiveRecord::Base
|
|
167
195
|
def confirmation_email_uniqueness
|
168
196
|
errors.add(:confirmation_email, :taken, value: email) if User.where('email = ?', confirmation_email).count > 0
|
169
197
|
end
|
170
|
-
|
171
198
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<div class="providers">
|
2
|
+
<%% providers.each do |provider| %>
|
3
|
+
<a href="/auth/<%%= provider %>?connect=1" class="oauth <%%= provider %>"><i class="fa <%%= provider_font_awesome_icon(provider) %>"></i> <%%= provider_formatted_name(provider) %> Account</a>
|
4
|
+
<%% end %>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<table class="connected">
|
8
|
+
<%% current_user.auths.order('provider, id').each do |auth| %>
|
9
|
+
<tr class="auth <%%= auth.provider %>">
|
10
|
+
<td width="30">
|
11
|
+
<%% unless auth.image_url.blank? %>
|
12
|
+
<img src="<%%= auth.image_url %>" class="avatar">
|
13
|
+
<%% end %>
|
14
|
+
</td>
|
15
|
+
<td>
|
16
|
+
<span class="name"><%%= auth.name %></span>
|
17
|
+
<%%= link_to 'Disconnect', disconnect_url(auth) %>
|
18
|
+
</td>
|
19
|
+
<td align="center">
|
20
|
+
<span class="icon"><i class="fa <%%= provider_font_awesome_icon(auth.provider) %>"></i></span>
|
21
|
+
</td>
|
22
|
+
</li>
|
23
|
+
<%% end %>
|
24
|
+
<%% if current_user.auths.count == 0 %>
|
25
|
+
<tr>
|
26
|
+
<td colspan="3">You have not connected any social accounts</td>
|
27
|
+
</tr>
|
28
|
+
<%% end %>
|
29
|
+
</table>
|
30
|
+
|
31
|
+
<div class="agreement">
|
32
|
+
By connecting your account you are also agreeing to our<br />
|
33
|
+
<a href="<%%= terms_path %>" target="_blank">Terms & Conditions</a> and <a href="<%%= privacy_path %>" target="_blank">Privacy Policy</a>
|
34
|
+
</div>
|
@@ -1,17 +1,17 @@
|
|
1
1
|
<h1>Please enter a new password</h1>
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
<%%= form_tag(password_change_path, method: "post") do %>
|
4
|
+
<%%= hidden_field_tag :token, params[:token] %>
|
5
|
+
<%%= hidden_field_tag :email, params[:email] %>
|
6
6
|
|
7
7
|
<div class="field">
|
8
|
-
|
9
|
-
|
8
|
+
<%%= label_tag "password" %>
|
9
|
+
<%%= password_field_tag "password" %>
|
10
10
|
</div>
|
11
11
|
<div class="field">
|
12
|
-
|
13
|
-
|
12
|
+
<%%= label_tag "password_confirmation" %>
|
13
|
+
<%%= password_field_tag "password_confirmation" %>
|
14
14
|
</div>
|
15
15
|
|
16
|
-
|
17
|
-
|
16
|
+
<%%= submit_tag "Change" %>
|
17
|
+
<%% end %>
|
@@ -1,12 +1,12 @@
|
|
1
1
|
<h1>Reset your password</h1>
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
<%%= form_tag(password_reset_path, method: "post") do %>
|
4
|
+
<%%= hidden_field_tag :token, params[:token] %>
|
5
5
|
|
6
6
|
<div class="field">
|
7
|
-
|
8
|
-
|
7
|
+
<%%= label_tag "email", "Email<% if username? %> or username<% end %>" %>
|
8
|
+
<%%= text_field_tag "email" %>
|
9
9
|
</div>
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
<%%= submit_tag "Reset" %>
|
12
|
+
<%% end %>
|
@@ -1,17 +1,35 @@
|
|
1
1
|
<h1>Sign In</h1>
|
2
2
|
|
3
|
-
|
3
|
+
<%%= form_tag(login_path, method: "post") do %>
|
4
4
|
<div class="field">
|
5
|
-
|
6
|
-
|
5
|
+
<%%= label_tag "email", "Email<% if username? %> or username<% end %>" %>
|
6
|
+
<%%= text_field_tag "email" %>
|
7
7
|
</div>
|
8
8
|
<div class="field">
|
9
|
-
|
10
|
-
|
9
|
+
<%%= label_tag "password" %>
|
10
|
+
<%%= password_field_tag "password" %>
|
11
11
|
</div>
|
12
12
|
<div class="field">
|
13
|
-
|
13
|
+
<%%= check_box_tag :remember_me, "1", true %>
|
14
14
|
<label for="remember_me">Keep me signed in on this computer</label>
|
15
15
|
</div>
|
16
|
-
|
16
|
+
<div class="login">
|
17
|
+
<%%= submit_tag "Login" %>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<div class="forgot">
|
21
|
+
<a href="/password/reset" class="forgot">Forgot your password?</a>
|
22
|
+
</div>
|
23
|
+
<%% end %>
|
24
|
+
|
25
|
+
<% if oauth? %>
|
26
|
+
<div class="or">
|
27
|
+
or sign in using a connected account
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<div class="providers">
|
31
|
+
<%% providers.each do |provider| %>
|
32
|
+
<a href="/auth/<%%= provider %>?login=1" class="oauth <%%= provider %>"><i class="fa <%%= provider_font_awesome_icon(provider) %>"></i> <%%= provider_formatted_name(provider) %> Account</a>
|
33
|
+
<%% end %>
|
34
|
+
</div>
|
17
35
|
<% end %>
|
@@ -1,62 +1,74 @@
|
|
1
1
|
<h1>Sign Up</h1>
|
2
2
|
|
3
|
-
<% if
|
3
|
+
<% if oauth? %>
|
4
|
+
<div class="providers">
|
5
|
+
<%% providers.each do |provider| %>
|
6
|
+
<a href="/auth/<%%= provider %>?signup=1" class="oauth <%%= provider %>"><i class="fa <%%= provider_font_awesome_icon(provider) %>"></i> <%%= provider_formatted_name(provider) %> Account</a>
|
7
|
+
<%% end %>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<div class="or">
|
11
|
+
or sign up using your email
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<%% if @signup.errors.any? %>
|
4
16
|
<div id="error_explanation">
|
5
17
|
<div class="alert alert-error">
|
6
|
-
The form contains
|
18
|
+
The form contains <%%= pluralize(@signup.errors.count, "error") %>.
|
7
19
|
</div>
|
8
20
|
<ul>
|
9
|
-
|
10
|
-
<li>*
|
11
|
-
|
21
|
+
<%% @signup.errors.full_messages.each do |msg| %>
|
22
|
+
<li>* <%%= msg %></li>
|
23
|
+
<%% end %>
|
12
24
|
</ul>
|
13
25
|
</div>
|
14
|
-
|
26
|
+
<%% end %>
|
15
27
|
|
16
|
-
|
28
|
+
<%%= form_for @signup, url: signup_path do |f| %>
|
17
29
|
<div class="field">
|
18
|
-
|
19
|
-
|
30
|
+
<%%= f.label "first_name" %>
|
31
|
+
<%%= f.text_field "first_name" %>
|
20
32
|
</div>
|
21
33
|
<div class="field">
|
22
|
-
|
23
|
-
|
34
|
+
<%%= f.label "last_name" %>
|
35
|
+
<%%= f.text_field "last_name" %>
|
24
36
|
</div>
|
25
37
|
<div class="field">
|
26
|
-
|
27
|
-
|
38
|
+
<%%= f.label "bio" %>
|
39
|
+
<%%= f.text_area "bio" %>
|
28
40
|
</div>
|
29
41
|
<div class="field">
|
30
|
-
|
31
|
-
|
42
|
+
<%%= f.label "website" %>
|
43
|
+
<%%= f.text_field "website" %>
|
32
44
|
</div>
|
33
45
|
<div class="field">
|
34
|
-
|
35
|
-
|
46
|
+
<%%= f.label "phone_number" %>
|
47
|
+
<%%= f.text_field "phone_number" %>
|
36
48
|
</div>
|
37
49
|
<div class="field">
|
38
|
-
|
39
|
-
|
50
|
+
<%%= f.label "time_zone" %>
|
51
|
+
<%%= f.time_zone_select('time_zone', ActiveSupport::TimeZone.us_zones, :default => "Pacific Time (US & Canada)") %>
|
40
52
|
</div>
|
41
53
|
<div class="field">
|
42
|
-
|
43
|
-
|
54
|
+
<%%= f.label "email" %>
|
55
|
+
<%%= f.text_field "email" %>
|
44
56
|
</div>
|
45
|
-
|
46
|
-
|
47
|
-
|
57
|
+
<% if username? %><div class="field">
|
58
|
+
<%%= f.label "username" %>
|
59
|
+
<%%= f.text_field "username" %>
|
48
60
|
</div>
|
49
|
-
|
50
|
-
|
51
|
-
|
61
|
+
<% end %><div class="field">
|
62
|
+
<%%= f.label "password" %>
|
63
|
+
<%%= f.password_field "password" %>
|
52
64
|
</div>
|
53
65
|
<div class="field">
|
54
|
-
|
55
|
-
|
66
|
+
<%%= f.label "password_confirmation" %>
|
67
|
+
<%%= f.password_field "password_confirmation" %>
|
56
68
|
</div>
|
57
69
|
<div class="field">
|
58
|
-
|
70
|
+
<%%= check_box_tag :remember_me, "1", true %>
|
59
71
|
<label for="remember_me">Keep me signed in on this computer</label>
|
60
72
|
</div>
|
61
|
-
|
62
|
-
|
73
|
+
<%%= f.submit "Sign up" %>
|
74
|
+
<%% end %>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<h1>One more step to complete your account</h1>
|
2
|
+
|
3
|
+
<%% if @user.errors.any? %>
|
4
|
+
<div id="error_explanation">
|
5
|
+
<div class="alert alert-error">
|
6
|
+
The form contains <%%= pluralize(@user.errors.count, "error") %>.
|
7
|
+
</div>
|
8
|
+
<ul>
|
9
|
+
<%% @user.errors.full_messages.each do |msg| %>
|
10
|
+
<li>* <%%= msg %></li>
|
11
|
+
<%% end %>
|
12
|
+
</ul>
|
13
|
+
</div>
|
14
|
+
<%% end %>
|
15
|
+
|
16
|
+
<%%= form_for @user do |f| %>
|
17
|
+
<div class="field">
|
18
|
+
<%%= f.label "first_name" %>
|
19
|
+
<%%= f.text_field "first_name" %>
|
20
|
+
</div>
|
21
|
+
<div class="field">
|
22
|
+
<%%= f.label "last_name" %>
|
23
|
+
<%%= f.text_field "last_name" %>
|
24
|
+
</div>
|
25
|
+
<div class="field">
|
26
|
+
<%%= f.label "email" %>
|
27
|
+
<%%= f.text_field "confirmation_email" %>
|
28
|
+
</div>
|
29
|
+
<div class="field">
|
30
|
+
<%%= f.label "password" %>
|
31
|
+
<%%= f.password_field "password" %>
|
32
|
+
</div>
|
33
|
+
<div class="field">
|
34
|
+
<%%= f.label "password_confirmation" %>
|
35
|
+
<%%= f.password_field "password_confirmation" %>
|
36
|
+
</div>
|
37
|
+
<%%= f.submit "Finish" %>
|
38
|
+
<%% end %>
|
39
|
+
|
@@ -1,58 +1,58 @@
|
|
1
1
|
<h1>Account</h1>
|
2
2
|
|
3
|
-
|
3
|
+
<%% if @user.errors.any? %>
|
4
4
|
<div id="error_explanation">
|
5
5
|
<div class="alert alert-error">
|
6
|
-
The form contains
|
6
|
+
The form contains <%%= pluralize(@user.errors.count, "error") %>.
|
7
7
|
</div>
|
8
8
|
<ul>
|
9
|
-
|
10
|
-
<li>*
|
11
|
-
|
9
|
+
<%% @user.errors.full_messages.each do |msg| %>
|
10
|
+
<li>* <%%= msg %></li>
|
11
|
+
<%% end %>
|
12
12
|
</ul>
|
13
13
|
</div>
|
14
|
-
|
14
|
+
<%% end %>
|
15
15
|
|
16
|
-
|
16
|
+
<%%= form_for @user do |f| %>
|
17
17
|
<div class="field">
|
18
|
-
|
19
|
-
|
18
|
+
<%%= f.label "first_name" %>
|
19
|
+
<%%= f.text_field "first_name" %>
|
20
20
|
</div>
|
21
21
|
<div class="field">
|
22
|
-
|
23
|
-
|
22
|
+
<%%= f.label "last_name" %>
|
23
|
+
<%%= f.text_field "last_name" %>
|
24
24
|
</div>
|
25
25
|
<div class="field">
|
26
|
-
|
27
|
-
|
26
|
+
<%%= f.label "bio" %>
|
27
|
+
<%%= f.text_area "bio" %>
|
28
28
|
</div>
|
29
29
|
<div class="field">
|
30
|
-
|
31
|
-
|
30
|
+
<%%= f.label "website" %>
|
31
|
+
<%%= f.text_field "website" %>
|
32
32
|
</div>
|
33
33
|
<div class="field">
|
34
|
-
|
35
|
-
|
34
|
+
<%%= f.label "phone_number" %>
|
35
|
+
<%%= f.text_field "phone_number" %>
|
36
36
|
</div>
|
37
37
|
<div class="field">
|
38
|
-
|
39
|
-
|
38
|
+
<%%= f.label "time_zone" %>
|
39
|
+
<%%= f.time_zone_select('time_zone', ActiveSupport::TimeZone.us_zones, :default => "Pacific Time (US & Canada)") %>
|
40
40
|
</div>
|
41
41
|
<div class="field">
|
42
|
-
|
43
|
-
|
42
|
+
<%%= f.label "email" %>
|
43
|
+
<%%= f.text_field "confirmation_email" %>
|
44
44
|
</div>
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
<% if username? %><div class="field">
|
46
|
+
<%%= f.label "username" %>
|
47
|
+
<%%= f.text_field "username" %>
|
48
48
|
</div>
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
<% end %><div class="field">
|
50
|
+
<%%= f.label "password" %>
|
51
|
+
<%%= f.password_field "password" %>
|
52
52
|
</div>
|
53
53
|
<div class="field">
|
54
|
-
|
55
|
-
|
54
|
+
<%%= f.label "password_confirmation" %>
|
55
|
+
<%%= f.password_field "password_confirmation" %>
|
56
56
|
</div>
|
57
|
-
|
58
|
-
|
57
|
+
<%%= f.submit "Save" %>
|
58
|
+
<%% end %>
|