somatics3-generators 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +60 -0
- data/VERSION +1 -0
- data/bin/somatics +21 -0
- data/bin/somatify +21 -0
- data/lib/generators/somatics/authenticated/authenticated_generator.rb +220 -0
- data/lib/generators/somatics/authenticated/templates/mailer.rb +25 -0
- data/lib/generators/somatics/authenticated/templates/migration.rb +26 -0
- data/lib/generators/somatics/authenticated/templates/model.rb +83 -0
- data/lib/generators/somatics/authenticated/templates/observer.rb +11 -0
- data/lib/generators/somatics/authenticated/templates/test/mailer_test.rb +31 -0
- data/lib/generators/somatics/authenticated/templates/test/model_functional_test.rb +93 -0
- data/lib/generators/somatics/authenticated/templates/test/sessions_functional_test.rb +82 -0
- data/lib/generators/somatics/authenticated/templates/test/unit_test.rb +164 -0
- data/lib/generators/somatics/authenticated/templates/test/users.yml +60 -0
- data/lib/generators/somatics/authenticated_controller/authenticated_controller_generator.rb +323 -0
- data/lib/generators/somatics/authenticated_controller/templates/_model_partial.html.erb +8 -0
- data/lib/generators/somatics/authenticated_controller/templates/activation.erb +3 -0
- data/lib/generators/somatics/authenticated_controller/templates/authenticated_system.rb +189 -0
- data/lib/generators/somatics/authenticated_controller/templates/authenticated_test_helper.rb +10 -0
- data/lib/generators/somatics/authenticated_controller/templates/config/initializers/site_keys.rb +38 -0
- data/lib/generators/somatics/authenticated_controller/templates/controller.rb +55 -0
- data/lib/generators/somatics/authenticated_controller/templates/helper.rb +91 -0
- data/lib/generators/somatics/authenticated_controller/templates/login.html.erb +29 -0
- data/lib/generators/somatics/authenticated_controller/templates/mailer.rb +25 -0
- data/lib/generators/somatics/authenticated_controller/templates/migration.rb +26 -0
- data/lib/generators/somatics/authenticated_controller/templates/model.rb +83 -0
- data/lib/generators/somatics/authenticated_controller/templates/observer.rb +11 -0
- data/lib/generators/somatics/authenticated_controller/templates/session_helper.rb +2 -0
- data/lib/generators/somatics/authenticated_controller/templates/sessions_controller.rb +43 -0
- data/lib/generators/somatics/authenticated_controller/templates/signup.html.erb +19 -0
- data/lib/generators/somatics/authenticated_controller/templates/signup_notification.erb +8 -0
- data/lib/generators/somatics/authenticated_controller/templates/test/mailer_test.rb +31 -0
- data/lib/generators/somatics/authenticated_controller/templates/test/model_functional_test.rb +93 -0
- data/lib/generators/somatics/authenticated_controller/templates/test/sessions_functional_test.rb +82 -0
- data/lib/generators/somatics/authenticated_controller/templates/test/unit_test.rb +164 -0
- data/lib/generators/somatics/authenticated_controller/templates/test/users.yml +60 -0
- data/lib/generators/somatics/helper/helper_generator.rb +16 -0
- data/lib/generators/somatics/install/install_generator.rb +65 -0
- data/lib/generators/somatics/install/templates/config/locales/somatics_en.yml +33 -0
- data/lib/generators/somatics/install/templates/config/locales/somatics_zh-TW.yml +33 -0
- data/lib/generators/somatics/install/templates/controller_admin.rb +16 -0
- data/lib/generators/somatics/install/templates/controller_home.rb +4 -0
- data/lib/generators/somatics/install/templates/helper_admin.rb +68 -0
- data/lib/generators/somatics/install/templates/layout_admin.html.erb +88 -0
- data/lib/generators/somatics/install/templates/lib/somatic_link_renderer.rb +42 -0
- data/lib/generators/somatics/install/templates/partial_menu.html.erb +1 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/add.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/arrow_collapsed.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/arrow_expanded.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/attachment.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/bullet_arrow_left.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/bullet_arrow_right.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/bullet_diamond.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/bullet_end.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/bullet_go.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/bullet_toggle_minus.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/bullet_toggle_plus.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/c.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/cancel.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/changeset.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/comment.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/comments.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/content-left.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/content-right.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/copy.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/csharp.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/database_key.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/default.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/delete.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/document.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/draft.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/duplicate.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/edit.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/exclamation.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/external.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/fav.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/fav_off.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/feed.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/folder.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/folder_open.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/footer-bg.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/footer-left.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/footer-right.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/group.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/help.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/history.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/image.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/lightning.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/link.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/loading.gif +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/locked.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/message.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/milestone.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/move.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/news.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/openid-bg.gif +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/package.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/pdf.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/php.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/plugin.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/projects.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/rails.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/reload.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/report.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/ruby.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/save.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/sort_asc.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/sort_desc.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/stats.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/table_multiple.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/task_done.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/task_late.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/task_parent_end.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/task_todo.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/text.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/text_list_bullets.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/textfield.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/ticket.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/ticket_checked.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/ticket_edit.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/ticket_go.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/ticket_note.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/time.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/time_add.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/toggle_check.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/true.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/unlock.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/user.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/warning.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/wiki_edit.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/xml.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/zip.png +0 -0
- data/lib/generators/somatics/install/templates/public/images/somatics/zoom_in.png +0 -0
- data/lib/generators/somatics/install/templates/public/javascripts/somatics/base.js +231 -0
- data/lib/generators/somatics/install/templates/public/javascripts/somatics/context_menu.js +237 -0
- data/lib/generators/somatics/install/templates/public/javascripts/somatics/controls.js +965 -0
- data/lib/generators/somatics/install/templates/public/javascripts/somatics/dragdrop.js +974 -0
- data/lib/generators/somatics/install/templates/public/javascripts/somatics/effects.js +1123 -0
- data/lib/generators/somatics/install/templates/public/javascripts/somatics/prototype.js +6001 -0
- data/lib/generators/somatics/install/templates/public/javascripts/somatics/rails.js +175 -0
- data/lib/generators/somatics/install/templates/public/javascripts/somatics/select_list_move.js +82 -0
- data/lib/generators/somatics/install/templates/public/stylesheets/somatics/base.css +948 -0
- data/lib/generators/somatics/install/templates/public/stylesheets/somatics/context_menu.css +52 -0
- data/lib/generators/somatics/install/templates/public/stylesheets/somatics/csshover.htc +122 -0
- data/lib/generators/somatics/install/templates/public/stylesheets/somatics/jstoolbar.css +95 -0
- data/lib/generators/somatics/install/templates/view_index.html.erb +1 -0
- data/lib/generators/somatics/scaffold/scaffold_generator.rb +25 -0
- data/lib/generators/somatics/scaffold/templates/_form.html.erb +23 -0
- data/lib/generators/somatics/scaffold/templates/edit.html.erb +6 -0
- data/lib/generators/somatics/scaffold/templates/index.html.erb +27 -0
- data/lib/generators/somatics/scaffold/templates/new.html.erb +5 -0
- data/lib/generators/somatics/scaffold/templates/show.html.erb +12 -0
- data/lib/generators/somatics/scaffold_controller/USAGE +20 -0
- data/lib/generators/somatics/scaffold_controller/scaffold_controller_generator.rb +137 -0
- data/lib/generators/somatics/scaffold_controller/templates/builder_index.pdf.prawn +25 -0
- data/lib/generators/somatics/scaffold_controller/templates/builder_index.xls.builder +24 -0
- data/lib/generators/somatics/scaffold_controller/templates/builder_index.xml.builder +10 -0
- data/lib/generators/somatics/scaffold_controller/templates/controller.rb +140 -0
- data/lib/generators/somatics/scaffold_controller/templates/locales_en.yml +17 -0
- data/lib/generators/somatics/scaffold_controller/templates/locales_zh-TW.yml +20 -0
- data/lib/generators/somatics/scaffold_controller/templates/partial_bulk.html.erb +12 -0
- data/lib/generators/somatics/scaffold_controller/templates/partial_edit.html.erb +7 -0
- data/lib/generators/somatics/scaffold_controller/templates/partial_form.html.erb +13 -0
- data/lib/generators/somatics/scaffold_controller/templates/partial_list.html.erb +42 -0
- data/lib/generators/somatics/scaffold_controller/templates/partial_menu.html.erb +1 -0
- data/lib/generators/somatics/scaffold_controller/templates/partial_show.html.erb +31 -0
- data/lib/generators/somatics/scaffold_controller/templates/view_edit.html.erb +24 -0
- data/lib/generators/somatics/scaffold_controller/templates/view_index.html.erb +28 -0
- data/lib/generators/somatics/scaffold_controller/templates/view_new.html.erb +14 -0
- data/lib/generators/somatics/scaffold_controller/templates/view_show.html.erb +24 -0
- data/lib/generators/somatics.rb +95 -0
- data/lib/somatics3-generators.rb +19 -0
- data/somatics3-generators.gemspec +223 -0
- data/templates/somatics.rb +128 -0
- data/test/helper.rb +10 -0
- data/test/test_somatics3-generators.rb +7 -0
- metadata +301 -0
@@ -0,0 +1,82 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
require '<%= sessions_controller_name %>_controller'
|
3
|
+
|
4
|
+
# Re-raise errors caught by the controller.
|
5
|
+
class <%= sessions_controller_class_name %>Controller; def rescue_action(e) raise e end; end
|
6
|
+
|
7
|
+
class <%= sessions_controller_class_name %>ControllerTest < ActionController::TestCase
|
8
|
+
# Be sure to include AuthenticatedTestHelper in test/test_helper.rb instead
|
9
|
+
# Then, you can remove it from this and the units test.
|
10
|
+
include <%= class_name %>AuthenticatedTestHelper
|
11
|
+
|
12
|
+
fixtures :<%= table_name %>
|
13
|
+
|
14
|
+
def test_should_login_and_redirect
|
15
|
+
post :create, :login => 'quentin', :password => 'monkey'
|
16
|
+
assert session[:<%= file_name %>_id]
|
17
|
+
assert_response :redirect
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_should_fail_login_and_not_redirect
|
21
|
+
post :create, :login => 'quentin', :password => 'bad password'
|
22
|
+
assert_nil session[:<%= file_name %>_id]
|
23
|
+
assert_response :success
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_logout
|
27
|
+
login_as :quentin
|
28
|
+
get :destroy
|
29
|
+
assert_nil session[:<%= file_name %>_id]
|
30
|
+
assert_response :redirect
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_remember_me
|
34
|
+
@request.cookies["auth_token"] = nil
|
35
|
+
post :create, :login => 'quentin', :password => 'monkey', :remember_me => "1"
|
36
|
+
assert_not_nil @response.cookies["auth_token"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_should_not_remember_me
|
40
|
+
@request.cookies["auth_token"] = nil
|
41
|
+
post :create, :login => 'quentin', :password => 'monkey', :remember_me => "0"
|
42
|
+
puts @response.cookies["auth_token"]
|
43
|
+
assert @response.cookies["auth_token"].blank?
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_delete_token_on_logout
|
47
|
+
login_as :quentin
|
48
|
+
get :destroy
|
49
|
+
assert @response.cookies["auth_token"].blank?
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_should_login_with_cookie
|
53
|
+
<%= table_name %>(:quentin).remember_me
|
54
|
+
@request.cookies["auth_token"] = cookie_for(:quentin)
|
55
|
+
get :new
|
56
|
+
assert @controller.send(:logged_in?)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_should_fail_expired_cookie_login
|
60
|
+
<%= table_name %>(:quentin).remember_me
|
61
|
+
<%= table_name %>(:quentin).update_attribute :remember_token_expires_at, 5.minutes.ago
|
62
|
+
@request.cookies["auth_token"] = cookie_for(:quentin)
|
63
|
+
get :new
|
64
|
+
assert !@controller.send(:logged_in?)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_should_fail_cookie_login
|
68
|
+
<%= table_name %>(:quentin).remember_me
|
69
|
+
@request.cookies["auth_token"] = auth_token('invalid_auth_token')
|
70
|
+
get :new
|
71
|
+
assert !@controller.send(:logged_in?)
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
def auth_token(token)
|
76
|
+
CGI::Cookie.new('name' => 'auth_token', 'value' => token)
|
77
|
+
end
|
78
|
+
|
79
|
+
def cookie_for(<%= file_name %>)
|
80
|
+
auth_token <%= table_name %>(<%= file_name %>).remember_token
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class <%= class_name %>Test < ActiveSupport::TestCase
|
4
|
+
# Be sure to include AuthenticatedTestHelper in test/test_helper.rb instead.
|
5
|
+
# Then, you can remove it from this and the functional test.
|
6
|
+
include <%= class_name %>AuthenticatedTestHelper
|
7
|
+
fixtures :<%= table_name %>
|
8
|
+
|
9
|
+
def test_should_create_<%= file_name %>
|
10
|
+
assert_difference '<%= class_name %>.count' do
|
11
|
+
<%= file_name %> = create_<%= file_name %>
|
12
|
+
assert !<%= file_name %>.new_record?, "#{<%= file_name %>.errors.full_messages.to_sentence}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
<% if options[:include_activation] %>
|
16
|
+
def test_should_initialize_activation_code_upon_creation
|
17
|
+
<%= file_name %> = create_<%= file_name %>
|
18
|
+
<%= file_name %>.reload
|
19
|
+
assert_not_nil <%= file_name %>.activation_code
|
20
|
+
end
|
21
|
+
<% end %><% if options[:stateful] %>
|
22
|
+
def test_should_create_and_start_in_pending_state
|
23
|
+
<%= file_name %> = create_<%= file_name %>
|
24
|
+
<%= file_name %>.reload
|
25
|
+
assert <%= file_name %>.pending?
|
26
|
+
end
|
27
|
+
|
28
|
+
<% end %>
|
29
|
+
def test_should_require_login
|
30
|
+
assert_no_difference '<%= class_name %>.count' do
|
31
|
+
u = create_<%= file_name %>(:login => nil)
|
32
|
+
assert u.errors.on(:login)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_should_require_password
|
37
|
+
assert_no_difference '<%= class_name %>.count' do
|
38
|
+
u = create_<%= file_name %>(:password => nil)
|
39
|
+
assert u.errors.on(:password)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_should_require_password_confirmation
|
44
|
+
assert_no_difference '<%= class_name %>.count' do
|
45
|
+
u = create_<%= file_name %>(:password_confirmation => nil)
|
46
|
+
assert u.errors.on(:password_confirmation)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_should_require_email
|
51
|
+
assert_no_difference '<%= class_name %>.count' do
|
52
|
+
u = create_<%= file_name %>(:email => nil)
|
53
|
+
assert u.errors.on(:email)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_should_reset_password
|
58
|
+
<%= table_name %>(:quentin).update_attributes(:password => 'new password', :password_confirmation => 'new password')
|
59
|
+
assert_equal <%= table_name %>(:quentin), <%= class_name %>.authenticate('quentin', 'new password')
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_should_not_rehash_password
|
63
|
+
<%= table_name %>(:quentin).update_attributes(:login => 'quentin2')
|
64
|
+
assert_equal <%= table_name %>(:quentin), <%= class_name %>.authenticate('quentin2', 'monkey')
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_should_authenticate_<%= file_name %>
|
68
|
+
assert_equal <%= table_name %>(:quentin), <%= class_name %>.authenticate('quentin', 'monkey')
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_should_set_remember_token
|
72
|
+
<%= table_name %>(:quentin).remember_me
|
73
|
+
assert_not_nil <%= table_name %>(:quentin).remember_token
|
74
|
+
assert_not_nil <%= table_name %>(:quentin).remember_token_expires_at
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_should_unset_remember_token
|
78
|
+
<%= table_name %>(:quentin).remember_me
|
79
|
+
assert_not_nil <%= table_name %>(:quentin).remember_token
|
80
|
+
<%= table_name %>(:quentin).forget_me
|
81
|
+
assert_nil <%= table_name %>(:quentin).remember_token
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_should_remember_me_for_one_week
|
85
|
+
before = 1.week.from_now.utc
|
86
|
+
<%= table_name %>(:quentin).remember_me_for 1.week
|
87
|
+
after = 1.week.from_now.utc
|
88
|
+
assert_not_nil <%= table_name %>(:quentin).remember_token
|
89
|
+
assert_not_nil <%= table_name %>(:quentin).remember_token_expires_at
|
90
|
+
assert <%= table_name %>(:quentin).remember_token_expires_at.between?(before, after)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_should_remember_me_until_one_week
|
94
|
+
time = 1.week.from_now.utc
|
95
|
+
<%= table_name %>(:quentin).remember_me_until time
|
96
|
+
assert_not_nil <%= table_name %>(:quentin).remember_token
|
97
|
+
assert_not_nil <%= table_name %>(:quentin).remember_token_expires_at
|
98
|
+
assert_equal <%= table_name %>(:quentin).remember_token_expires_at, time
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_should_remember_me_default_two_weeks
|
102
|
+
before = 2.weeks.from_now.utc
|
103
|
+
<%= table_name %>(:quentin).remember_me
|
104
|
+
after = 2.weeks.from_now.utc
|
105
|
+
assert_not_nil <%= table_name %>(:quentin).remember_token
|
106
|
+
assert_not_nil <%= table_name %>(:quentin).remember_token_expires_at
|
107
|
+
assert <%= table_name %>(:quentin).remember_token_expires_at.between?(before, after)
|
108
|
+
end
|
109
|
+
<% if options[:stateful] %>
|
110
|
+
def test_should_register_passive_<%= file_name %>
|
111
|
+
<%= file_name %> = create_<%= file_name %>(:password => nil, :password_confirmation => nil)
|
112
|
+
assert <%= file_name %>.passive?
|
113
|
+
<%= file_name %>.update_attributes(:password => 'new password', :password_confirmation => 'new password')
|
114
|
+
<%= file_name %>.register!
|
115
|
+
assert <%= file_name %>.pending?
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_should_suspend_<%= file_name %>
|
119
|
+
<%= table_name %>(:quentin).suspend!
|
120
|
+
assert <%= table_name %>(:quentin).suspended?
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_suspended_<%= file_name %>_should_not_authenticate
|
124
|
+
<%= table_name %>(:quentin).suspend!
|
125
|
+
assert_not_equal <%= table_name %>(:quentin), <%= class_name %>.authenticate('quentin', 'test')
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_should_unsuspend_<%= file_name %>_to_active_state
|
129
|
+
<%= table_name %>(:quentin).suspend!
|
130
|
+
assert <%= table_name %>(:quentin).suspended?
|
131
|
+
<%= table_name %>(:quentin).unsuspend!
|
132
|
+
assert <%= table_name %>(:quentin).active?
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_should_unsuspend_<%= file_name %>_with_nil_activation_code_and_activated_at_to_passive_state
|
136
|
+
<%= table_name %>(:quentin).suspend!
|
137
|
+
<%= class_name %>.update_all :activation_code => nil, :activated_at => nil
|
138
|
+
assert <%= table_name %>(:quentin).suspended?
|
139
|
+
<%= table_name %>(:quentin).reload.unsuspend!
|
140
|
+
assert <%= table_name %>(:quentin).passive?
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_should_unsuspend_<%= file_name %>_with_activation_code_and_nil_activated_at_to_pending_state
|
144
|
+
<%= table_name %>(:quentin).suspend!
|
145
|
+
<%= class_name %>.update_all :activation_code => 'foo-bar', :activated_at => nil
|
146
|
+
assert <%= table_name %>(:quentin).suspended?
|
147
|
+
<%= table_name %>(:quentin).reload.unsuspend!
|
148
|
+
assert <%= table_name %>(:quentin).pending?
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_should_delete_<%= file_name %>
|
152
|
+
assert_nil <%= table_name %>(:quentin).deleted_at
|
153
|
+
<%= table_name %>(:quentin).delete!
|
154
|
+
assert_not_nil <%= table_name %>(:quentin).deleted_at
|
155
|
+
assert <%= table_name %>(:quentin).deleted?
|
156
|
+
end
|
157
|
+
<% end %>
|
158
|
+
protected
|
159
|
+
def create_<%= file_name %>(options = {})
|
160
|
+
record = <%= class_name %>.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire69', :password_confirmation => 'quire69' }.merge(options))
|
161
|
+
record.<% if options[:stateful] %>register! if record.valid?<% else %>save<% end %>
|
162
|
+
record
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
<%
|
2
|
+
## this code must match that in templates/model.rb
|
3
|
+
require 'digest/sha1'
|
4
|
+
def make_fake_token
|
5
|
+
@fake_token_counter ||= 0
|
6
|
+
@fake_token_counter += 1
|
7
|
+
Digest::SHA1.hexdigest(@fake_token_counter.to_s)
|
8
|
+
end
|
9
|
+
salts = (1..2).map{ make_fake_token }
|
10
|
+
passwds = salts.map{ |salt| password_digest('monkey', salt) }
|
11
|
+
-%>
|
12
|
+
|
13
|
+
quentin:
|
14
|
+
id: 1
|
15
|
+
login: quentin
|
16
|
+
email: quentin@example.com
|
17
|
+
salt: <%= salts[0] %> # SHA1('0')
|
18
|
+
crypted_password: <%= passwds[0] %> # 'monkey'
|
19
|
+
created_at: <%%= 5.days.ago.to_s :db %>
|
20
|
+
remember_token_expires_at: <%%= 1.days.from_now.to_s %>
|
21
|
+
remember_token: <%= make_fake_token %>
|
22
|
+
<% if options[:include_activation] -%>
|
23
|
+
activation_code:
|
24
|
+
activated_at: <%%= 5.days.ago.to_s :db %>
|
25
|
+
<% end -%>
|
26
|
+
<% if options[:stateful] -%>
|
27
|
+
state: active
|
28
|
+
<% end -%>
|
29
|
+
|
30
|
+
aaron:
|
31
|
+
id: 2
|
32
|
+
login: aaron
|
33
|
+
email: aaron@example.com
|
34
|
+
salt: <%= salts[1] %> # SHA1('1')
|
35
|
+
crypted_password: <%= passwds[1] %> # 'monkey'
|
36
|
+
created_at: <%%= 1.days.ago.to_s :db %>
|
37
|
+
remember_token_expires_at:
|
38
|
+
remember_token:
|
39
|
+
<% if options[:include_activation] -%>
|
40
|
+
activation_code: <%= make_fake_token %>
|
41
|
+
activated_at:
|
42
|
+
<% end -%>
|
43
|
+
<% if options[:stateful] %>
|
44
|
+
state: pending
|
45
|
+
<% end -%>
|
46
|
+
|
47
|
+
|
48
|
+
old_password_holder:
|
49
|
+
id: 3
|
50
|
+
login: old_password_holder
|
51
|
+
email: salty_dog@example.com
|
52
|
+
salt: 7e3041ebc2fc05a40c60028e2c4901a81035d3cd
|
53
|
+
crypted_password: 00742970dc9e6319f8019fd54864d3ea740f04b1 # test
|
54
|
+
created_at: <%%= 1.days.ago.to_s :db %>
|
55
|
+
<% if options[:include_activation] %>
|
56
|
+
activation_code:
|
57
|
+
activated_at: <%%= 5.days.ago.to_s :db %>
|
58
|
+
<% end %>
|
59
|
+
<% if options[:stateful] %>
|
60
|
+
state: active<% end %>
|
@@ -0,0 +1,323 @@
|
|
1
|
+
require 'generators/somatics'
|
2
|
+
require 'rails/generators/named_base'
|
3
|
+
require 'rails/generators/resource_helpers'
|
4
|
+
require 'digest/sha1'
|
5
|
+
require 'rails/generators/migration'
|
6
|
+
|
7
|
+
module Somatics
|
8
|
+
module Generators
|
9
|
+
class AuthenticatedControllerGenerator < Rails::Generators::NamedBase
|
10
|
+
extend TemplatePath
|
11
|
+
include Rails::Generators::ResourceHelpers
|
12
|
+
include Rails::Generators::Migration
|
13
|
+
# hook_for :authenticated , :in => :somatics, :as => :scaffold, :default => 'somatics:scaffold' do |instance, command|
|
14
|
+
# instance.invoke command, [ class_name, attributes], {:namespace => 'admin' }
|
15
|
+
# end
|
16
|
+
|
17
|
+
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
18
|
+
class_option :namespace, :banner => "NAME", :type => :string
|
19
|
+
class_option :model, :banner => 'ClasName', :type => :string
|
20
|
+
|
21
|
+
class_option :skip_routes, :type => :boolean, :desc => "Don't generate a resource line in config/routes.rb."
|
22
|
+
class_option :skip_migration, :type => :boolean, :desc => "Don't generate a migration file for this model."
|
23
|
+
class_option :aasm, :type => :boolean, :desc => "Works the same as stateful but uses the updated aasm gem"
|
24
|
+
class_option :stateful, :type => :boolean, :desc => "Builds in support for acts_as_state_machine and generatesactivation code."
|
25
|
+
class_option :rspec, :type => :boolean, :desc => "Generate RSpec tests and Stories in place of standard rails tests."
|
26
|
+
class_option :old_passwords, :type => :boolean, :desc => "Use the older password scheme"
|
27
|
+
class_option :include_activation, :type => :boolean, :desc => "Skip the code for a ActionMailer and its respective Activation Code through email"
|
28
|
+
class_option :dump_generator_attrs, :type => :boolean, :desc => "Dump Generator Attrs"
|
29
|
+
|
30
|
+
# Try to be idempotent:
|
31
|
+
# pull in the existing site key if any,
|
32
|
+
# seed it with reasonable defaults otherwise
|
33
|
+
#
|
34
|
+
def load_or_initialize_site_keys
|
35
|
+
case
|
36
|
+
when defined? REST_AUTH_SITE_KEY
|
37
|
+
if (options[:old_passwords]) && ((! REST_AUTH_SITE_KEY.blank?) || (REST_AUTH_DIGEST_STRETCHES != 1))
|
38
|
+
raise "You have a site key, but --old-passwords will overwrite it. If this is really what you want, move the file #{site_keys_file} and re-run."
|
39
|
+
end
|
40
|
+
$rest_auth_site_key_from_generator = REST_AUTH_SITE_KEY
|
41
|
+
$rest_auth_digest_stretches_from_generator = REST_AUTH_DIGEST_STRETCHES
|
42
|
+
when options[:old_passwords]
|
43
|
+
$rest_auth_site_key_from_generator = nil
|
44
|
+
$rest_auth_digest_stretches_from_generator = 1
|
45
|
+
$rest_auth_keys_are_new = true
|
46
|
+
else
|
47
|
+
$rest_auth_site_key_from_generator = make_token
|
48
|
+
$rest_auth_digest_stretches_from_generator = 10
|
49
|
+
$rest_auth_keys_are_new = true
|
50
|
+
end
|
51
|
+
# template 'config/initializers/site_keys.rb', "config/initializers/#{controller_file_name}_site_keys.rb"
|
52
|
+
template 'config/initializers/site_keys.rb'
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_controller_files
|
56
|
+
template 'controller.rb', File.join('app/controllers',"#{options.namespace}", controller_class_path, "#{ controller_file_name }_controller.rb")
|
57
|
+
end
|
58
|
+
|
59
|
+
def generate_lib_files
|
60
|
+
# Check for class naming collisions.
|
61
|
+
class_collisions [], "#{class_name}AuthenticatedSystem", "#{class_name}AuthenticatedTestHelper"
|
62
|
+
|
63
|
+
template 'authenticated_system.rb', File.join('lib', "#{file_name}_authenticated_system.rb")
|
64
|
+
template 'authenticated_test_helper.rb', File.join('lib', "#{file_name}_authenticated_test_helper.rb")
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_test_files
|
68
|
+
#TODO : Create test files
|
69
|
+
end
|
70
|
+
|
71
|
+
def create_helper_files
|
72
|
+
template 'session_helper.rb', File.join('app/helpers', sessions_controller_class_path, "#{ sessions_controller_controller_name }_helper.rb")
|
73
|
+
template 'helper.rb', File.join('app/helpers', controller_class_path, "#{ controller_file_name }_helper.rb")
|
74
|
+
end
|
75
|
+
|
76
|
+
def generate_sessions_controller
|
77
|
+
|
78
|
+
# Check for class naming collisions.
|
79
|
+
class_collisions sessions_controller_class_path, "#{sessions_controller_class_name}Controller", # Sessions Controller
|
80
|
+
"#{sessions_controller_class_name}Helper"
|
81
|
+
|
82
|
+
template 'sessions_controller.rb', File.join('app/controllers', sessions_controller_class_path, "#{sessions_controller_controller_name}_controller.rb")
|
83
|
+
# template 'session_helper.rb', File.join('app/helpers', sessions_controller_class_path, "#{sessions_controller_controller_name}_helper.rb")
|
84
|
+
# template 'test/sessions_functional_test.rb', File.join('test/functional', sessions_controller_class_path, "#{sessions_controller_file_name}_controller_test.rb")
|
85
|
+
|
86
|
+
# View templates
|
87
|
+
# template 'login.html.erb', File.join('app/views', sessions_controller_class_path, sessions_controller_file_name, "new.html.erb")
|
88
|
+
template 'login.html.erb', File.join('app/views', sessions_controller_file_path, 'new.html.erb')
|
89
|
+
# template 'signup.html.erb', File.join('app/views', controller_class_path, controller_file_name, "signup.html.erb")
|
90
|
+
template 'signup.html.erb', File.join('app/views', controller_file_path, 'new.html.erb')
|
91
|
+
# template '_model_partial.html.erb', File.join('app/views', controller_class_path, controller_file_name, "_#{file_name}_bar.html.erb")
|
92
|
+
template '_model_partial.html.erb', File.join('app/views', sessions_controller_file_path, "_#{file_name}_bar.html.erb")
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
def generate_route
|
97
|
+
unless options[:skip_routes]
|
98
|
+
route_config = class_path.collect{|namespace| "namespace :#{namespace} do " }.join(" ")
|
99
|
+
route_config << "\n"
|
100
|
+
route_config << %Q{match '#{file_name}_signup' => '#{controller_plural_name}#new'}
|
101
|
+
route_config << "\n"
|
102
|
+
route_config << %Q{match '#{file_name}_register' => '#{controller_plural_name}#create'}
|
103
|
+
route_config << "\n"
|
104
|
+
route_config << %Q{match '#{file_name}_login' => '#{sessions_controller_controller_name}#new'}
|
105
|
+
route_config << "\n"
|
106
|
+
route_config << %Q{match '#{file_name}_logout' => '#{sessions_controller_controller_name}#destroy'}
|
107
|
+
route_config << "\n"
|
108
|
+
route_config << "match '/activate/:activation_code' => '#{ controller_plural_name }#activate', :as => :activate, :activation_code => nil"
|
109
|
+
route_config << "\n"
|
110
|
+
route_config << "resource #{ sessions_controller_singular_name.to_sym.inspect }, :only => [:new, :create, :destroy]"
|
111
|
+
route_config << "\n"
|
112
|
+
route_config << "resources #{ controller_plural_name.to_sym.inspect }"
|
113
|
+
route_config << "\n"
|
114
|
+
route_config << " end" * class_path.size
|
115
|
+
route route_config
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def insert_into_application_controller
|
120
|
+
puts "TODO: include #{class_name}AuthenticatedSystem"
|
121
|
+
puts "TODO: Add require #{class_name}in AuthenticatedSystem"
|
122
|
+
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
def dump_generator_attribute_names
|
127
|
+
generator_attribute_names = [
|
128
|
+
:namespace_class,
|
129
|
+
:namespace_name,
|
130
|
+
:table_name,
|
131
|
+
:file_name,
|
132
|
+
:class_name,
|
133
|
+
:sessions_controller_name,
|
134
|
+
:sessions_controller_class_path,
|
135
|
+
:sessions_controller_file_path,
|
136
|
+
# :sessions_controller_class_nesting,
|
137
|
+
# :sessions_controller_class_nesting_depth,
|
138
|
+
:sessions_controller_class_name,
|
139
|
+
:sessions_controller_singular_name,
|
140
|
+
:sessions_controller_plural_name,
|
141
|
+
:sessions_controller_routing_name, # new_session_path
|
142
|
+
:sessions_controller_routing_path, # /session/new
|
143
|
+
:sessions_controller_controller_name, # sessions
|
144
|
+
:sessions_controller_file_name,
|
145
|
+
:sessions_controller_table_name,
|
146
|
+
:controller_name,
|
147
|
+
:controller_class_path,
|
148
|
+
:controller_file_path,
|
149
|
+
# :controller_class_nesting,
|
150
|
+
# :controller_class_nesting_depth,
|
151
|
+
:controller_class_name,
|
152
|
+
:controller_singular_name,
|
153
|
+
:controller_plural_name,
|
154
|
+
:controller_routing_name, # new_user_path
|
155
|
+
:controller_routing_path, # /users/new
|
156
|
+
:controller_controller_name, # users
|
157
|
+
:controller_file_name,
|
158
|
+
:controller_singular_name,
|
159
|
+
:controller_table_name,
|
160
|
+
:controller_plural_name,
|
161
|
+
]
|
162
|
+
|
163
|
+
generator_attribute_names.each do |attr|
|
164
|
+
puts "%-40s %s" % ["#{attr}:", self.send(attr.to_s)] # instance_variable_get("@#{attr.to_s}"
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
# rails g authenticated FoonParent::Foon SporkParent::Spork -p --force --rspec --dump-generator-attrs
|
170
|
+
# table_name: foon_parent_foons
|
171
|
+
# file_name: foon
|
172
|
+
# class_name: FoonParent::Foon
|
173
|
+
# controller_name: SporkParent::Sporks
|
174
|
+
# controller_class_path: spork_parent
|
175
|
+
# controller_file_path: spork_parent/sporks
|
176
|
+
# controller_class_nesting: SporkParent
|
177
|
+
# controller_class_nesting_depth: 1
|
178
|
+
# controller_class_name: SporkParent::Sporks
|
179
|
+
# controller_singular_name: spork
|
180
|
+
# controller_plural_name: sporks
|
181
|
+
# controller_routing_name: spork
|
182
|
+
# controller_routing_path: spork_parent/spork
|
183
|
+
# controller_controller_name: sporks
|
184
|
+
# controller_file_name: sporks
|
185
|
+
# controller_table_name: sporks
|
186
|
+
# controller_plural_name: sporks
|
187
|
+
# model_controller_name: FoonParent::Foons
|
188
|
+
# model_controller_class_path: foon_parent
|
189
|
+
# model_controller_file_path: foon_parent/foons
|
190
|
+
# model_controller_class_nesting: FoonParent
|
191
|
+
# model_controller_class_nesting_depth: 1
|
192
|
+
# model_controller_class_name: FoonParent::Foons
|
193
|
+
# model_controller_singular_name: foons
|
194
|
+
# model_controller_plural_name: foons
|
195
|
+
# model_controller_routing_name: foon_parent_foons
|
196
|
+
# model_controller_routing_path: foon_parent/foons
|
197
|
+
# model_controller_controller_name: foons
|
198
|
+
# model_controller_file_name: foons
|
199
|
+
# model_controller_singular_name: foons
|
200
|
+
# model_controller_table_name: foons
|
201
|
+
# model_controller_plural_name: foons
|
202
|
+
|
203
|
+
|
204
|
+
protected
|
205
|
+
|
206
|
+
def namespace_class
|
207
|
+
options[:namespace].classify if options[:namespace].present?
|
208
|
+
end
|
209
|
+
|
210
|
+
def namespace_name
|
211
|
+
options[:namespace].underscore if options[:namespace].present?
|
212
|
+
end
|
213
|
+
|
214
|
+
def sessions_controller_name
|
215
|
+
file_name + '_sessions'
|
216
|
+
end
|
217
|
+
|
218
|
+
def sessions_controller_class_path
|
219
|
+
controller_class_path
|
220
|
+
end
|
221
|
+
|
222
|
+
def sessions_controller_file_path
|
223
|
+
controller_file_path.singularize + '_sessions'
|
224
|
+
end
|
225
|
+
|
226
|
+
def sessions_controller_singular_name
|
227
|
+
sessions_controller_file_name
|
228
|
+
end
|
229
|
+
|
230
|
+
def sessions_controller_plural_name
|
231
|
+
sessions_controller_file_name.pluralize
|
232
|
+
end
|
233
|
+
|
234
|
+
def sessions_controller_routing_name
|
235
|
+
sessions_controller_routing_path.parameterize.underscore # HACK
|
236
|
+
end
|
237
|
+
|
238
|
+
def sessions_controller_routing_path
|
239
|
+
sessions_controller_file_path.singularize
|
240
|
+
end
|
241
|
+
|
242
|
+
def sessions_controller_class_name
|
243
|
+
controller_class_name.singularize + 'Sessions'
|
244
|
+
end
|
245
|
+
|
246
|
+
def sessions_controller_controller_name
|
247
|
+
sessions_controller_plural_name
|
248
|
+
end
|
249
|
+
|
250
|
+
def sessions_controller_file_name
|
251
|
+
file_name + '_session'
|
252
|
+
end
|
253
|
+
|
254
|
+
def sessions_controller_table_name
|
255
|
+
sessions_controller_plural_name
|
256
|
+
end
|
257
|
+
|
258
|
+
def controller_plural_name
|
259
|
+
plural_name
|
260
|
+
end
|
261
|
+
|
262
|
+
def controller_singular_name
|
263
|
+
singular_name
|
264
|
+
end
|
265
|
+
|
266
|
+
def controller_routing_name
|
267
|
+
controller_routing_path.parameterize.underscore # HACK
|
268
|
+
end
|
269
|
+
|
270
|
+
def controller_routing_path
|
271
|
+
controller_file_path.singularize
|
272
|
+
end
|
273
|
+
|
274
|
+
def controller_controller_name
|
275
|
+
controller_plural_name
|
276
|
+
end
|
277
|
+
|
278
|
+
alias_method :controller_table_name, :controller_plural_name
|
279
|
+
|
280
|
+
def model_class_name
|
281
|
+
class_name unless options[:model].present?
|
282
|
+
options[:model].classify
|
283
|
+
end
|
284
|
+
|
285
|
+
def migration_name
|
286
|
+
"Create#{ class_name.pluralize.gsub(/::/, '') }"
|
287
|
+
end
|
288
|
+
|
289
|
+
def migration_file_name
|
290
|
+
"#{ file_path.gsub(/\//, '_').pluralize }"
|
291
|
+
end
|
292
|
+
|
293
|
+
#
|
294
|
+
# Implement the required interface for Rails::Generators::Migration.
|
295
|
+
# taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
|
296
|
+
#
|
297
|
+
def self.next_migration_number(dirname) #:nodoc:
|
298
|
+
if ActiveRecord::Base.timestamped_migrations
|
299
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
300
|
+
else
|
301
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
#
|
306
|
+
# !! These must match the corresponding routines in by_password.rb !!
|
307
|
+
#
|
308
|
+
def secure_digest(*args)
|
309
|
+
Digest::SHA1.hexdigest(args.flatten.join('--'))
|
310
|
+
end
|
311
|
+
def make_token
|
312
|
+
secure_digest(Time.now, (1..10).map{ rand.to_s })
|
313
|
+
end
|
314
|
+
def password_digest(password, salt)
|
315
|
+
digest = $rest_auth_site_key_from_generator
|
316
|
+
$rest_auth_digest_stretches_from_generator.times do
|
317
|
+
digest = secure_digest(digest, salt, password, $rest_auth_site_key_from_generator)
|
318
|
+
end
|
319
|
+
digest
|
320
|
+
end
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%% if logged_in? -%>
|
2
|
+
<div id="<%= file_name %>-bar-greeting">Logged in as <%%= link_to_current_<%= file_name %> :content_method => :login %></div>
|
3
|
+
<div id="<%= file_name %>-bar-action" >(<%%= link_to "Log out", logout_path, { :title => "Log out" } %>)</div>
|
4
|
+
<%% else -%>
|
5
|
+
<div id="<%= file_name %>-bar-greeting"><%%= link_to_login_with_IP 'Not logged in', :style => 'border: none;' %></div>
|
6
|
+
<div id="<%= file_name %>-bar-action" ><%%= link_to "Log in", login_path, { :title => "Log in" } %> /
|
7
|
+
<%%= link_to "Sign up", signup_path, { :title => "Create an account" } %></div>
|
8
|
+
<%% end -%>
|