dismissible_blocks 0.0.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 (86) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +7 -0
  3. data/LICENSE.text +22 -0
  4. data/README.markdown +152 -0
  5. data/Rakefile +34 -0
  6. data/app/assets/javascripts/dismissible_blocks.js +37 -0
  7. data/app/assets/javascripts/dismissible_blocks_loader.js +3 -0
  8. data/app/controllers/dismissible_blocks_controller.rb +3 -0
  9. data/app/helpers/dismissible_blocks_helper.rb +3 -0
  10. data/config/routes.rb +3 -0
  11. data/lib/dismissible_blocks/controller.rb +18 -0
  12. data/lib/dismissible_blocks/engine.rb +4 -0
  13. data/lib/dismissible_blocks/helper.rb +34 -0
  14. data/lib/dismissible_blocks/version.rb +3 -0
  15. data/lib/dismissible_blocks.rb +13 -0
  16. data/test/capybara_helper.rb +33 -0
  17. data/test/controllers/dismissible_blocks_controller_test.rb +18 -0
  18. data/test/dummy/Rakefile +3 -0
  19. data/test/dummy/app/assets/javascripts/application.js +3 -0
  20. data/test/dummy/app/assets/stylesheets/application.css +17 -0
  21. data/test/dummy/app/controllers/application_controller.rb +29 -0
  22. data/test/dummy/app/controllers/landings_controller.rb +6 -0
  23. data/test/dummy/app/controllers/sessions_controller.rb +28 -0
  24. data/test/dummy/app/helpers/application_helper.rb +2 -0
  25. data/test/dummy/app/helpers/landings_helper.rb +2 -0
  26. data/test/dummy/app/helpers/sessions_helper.rb +2 -0
  27. data/test/dummy/app/models/user.rb +9 -0
  28. data/test/dummy/app/views/landings/show.html.erb +10 -0
  29. data/test/dummy/app/views/layouts/application.html.erb +18 -0
  30. data/test/dummy/app/views/sessions/new.html.erb +15 -0
  31. data/test/dummy/bin/bundle +3 -0
  32. data/test/dummy/bin/rails +4 -0
  33. data/test/dummy/bin/rake +4 -0
  34. data/test/dummy/config/application.rb +10 -0
  35. data/test/dummy/config/boot.rb +4 -0
  36. data/test/dummy/config/database.yml +11 -0
  37. data/test/dummy/config/environment.rb +3 -0
  38. data/test/dummy/config/environments/development.rb +29 -0
  39. data/test/dummy/config/environments/test.rb +36 -0
  40. data/test/dummy/config/initializers/filter_parameter_logging.rb +1 -0
  41. data/test/dummy/config/initializers/secret_token.rb +1 -0
  42. data/test/dummy/config/initializers/session_store.rb +1 -0
  43. data/test/dummy/config/routes.rb +7 -0
  44. data/test/dummy/config.ru +3 -0
  45. data/test/dummy/db/migrate/20140303154458_create_users.rb +10 -0
  46. data/test/dummy/db/migrate/20140303161500_add_dismissed_blocks_to_users.rb +9 -0
  47. data/test/dummy/db/schema.rb +24 -0
  48. data/test/dummy/db/test.sqlite3 +0 -0
  49. data/test/dummy/log/development.log +6003 -0
  50. data/test/dummy/log/test.log +21144 -0
  51. data/test/dummy/public/404.html +58 -0
  52. data/test/dummy/public/422.html +58 -0
  53. data/test/dummy/public/500.html +57 -0
  54. data/test/dummy/public/favicon.ico +0 -0
  55. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  56. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  57. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  58. data/test/dummy/tmp/cache/assets/development/sprockets/489c5c881967a5316ffa31442761ffcb +0 -0
  59. data/test/dummy/tmp/cache/assets/development/sprockets/48d901fc62129ded86005b628a7f0f6f +0 -0
  60. data/test/dummy/tmp/cache/assets/development/sprockets/58a8328804a777933d757eb9a448eaf5 +0 -0
  61. data/test/dummy/tmp/cache/assets/development/sprockets/96c147c638b08a4c0178d9c66c3b9c48 +0 -0
  62. data/test/dummy/tmp/cache/assets/development/sprockets/9708d20fa7cc14e3657195722d1a3948 +0 -0
  63. data/test/dummy/tmp/cache/assets/development/sprockets/996481d37a8199e763e8fcf21a801422 +0 -0
  64. data/test/dummy/tmp/cache/assets/development/sprockets/ac2d5385dbcd9cea11c510dc83189bba +0 -0
  65. data/test/dummy/tmp/cache/assets/development/sprockets/bec12e1e92fe458e19b5f9869454ac1a +0 -0
  66. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  67. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  68. data/test/dummy/tmp/cache/assets/development/sprockets/ecbb0d7ff91e9d89fc001dcc70d1d48f +0 -0
  69. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  70. data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  71. data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  72. data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  73. data/test/dummy/tmp/cache/assets/test/sprockets/58a8328804a777933d757eb9a448eaf5 +0 -0
  74. data/test/dummy/tmp/cache/assets/test/sprockets/96c147c638b08a4c0178d9c66c3b9c48 +0 -0
  75. data/test/dummy/tmp/cache/assets/test/sprockets/9708d20fa7cc14e3657195722d1a3948 +0 -0
  76. data/test/dummy/tmp/cache/assets/test/sprockets/ac2d5385dbcd9cea11c510dc83189bba +0 -0
  77. data/test/dummy/tmp/cache/assets/test/sprockets/bec12e1e92fe458e19b5f9869454ac1a +0 -0
  78. data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  79. data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  80. data/test/dummy/tmp/cache/assets/test/sprockets/ecbb0d7ff91e9d89fc001dcc70d1d48f +0 -0
  81. data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  82. data/test/features/dismissible_blocks_test.rb +21 -0
  83. data/test/fixtures/users.yml +9 -0
  84. data/test/helpers/dismissible_blocks_helper_test.rb +53 -0
  85. data/test/test_helper.rb +9 -0
  86. metadata +297 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 790003b0d118f8a317c7a4ddfd43d7492314b8b1
4
+ data.tar.gz: 45a0169db67ceb236117ac3cf76cfcbdf80e5d77
5
+ SHA512:
6
+ metadata.gz: c9d9e57eb204c9071580e8d405aa91b871e2cec3127cc5f9c0953afc0e0aaabd70f182650cd6d9de7af8db86ac9c16b6295e5c3c2af6df710d94b1ab598949b0
7
+ data.tar.gz: 41d4a657714f5df13227ac55ba2ab443dd382ef453019b869c3091280d3c2e5a5fd28375a1241186b3c316b01ded4ad9b79923c2b16959500dd35b378b84a018
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ # jquery-rails is used by the Dummy app
6
+ # https://github.com/rails/rails/commit/007f5670
7
+ gem 'jquery-rails'
data/LICENSE.text ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Patrick Bougie
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,152 @@
1
+ # DismissibleBlocks
2
+
3
+ ## Overview
4
+ **DismissibleBlocks** is a Ruby on Rails engine that allows for dismissible blocks of HTML code whose state is saved in the database per user.
5
+
6
+
7
+ ## Installation
8
+ ### Requirements
9
+ The DismissibleBlocks gem has the following requirements:
10
+
11
+ - [Ruby on Rails](http://rubyonrails.org/) 3.2 or above
12
+ - [jQuery](http://jquery.com/)
13
+
14
+ ### Gemfile
15
+ Add the following line to your application's Gemfile:
16
+
17
+ gem 'dismissible_blocks'
18
+
19
+ And then execute:
20
+
21
+ $ bundle install
22
+
23
+ ### Manual Installation
24
+ Install it yourself:
25
+
26
+ $ gem install dismissible_blocks
27
+
28
+
29
+ ## Usage
30
+ ### Routes
31
+ DismissibleBlocks automatically adds the required routes when the gem is added to your project.
32
+
33
+ ### Views
34
+ Adding dismissible blocks of HTML code is very easy. DismissibleBlocks does not generate any extra HTML and therefore gives you complete control over your code.
35
+
36
+ To add a dismissible block to a view, use the `render_dismissible_block` helper method. This will create a dismissible block named `lorem`:
37
+
38
+ <%= render_dismissible_block 'lorem' do %>
39
+ ...
40
+ <% end %>
41
+
42
+ This alone isn't enough, you need to identify the container and button HTML. This is done using HTML5 `data-` attributes. There are two attributes that you must add to the HTML to make everything work as expected:
43
+
44
+ 1. `data-dismissible`: attribute for the container of the HTML block.
45
+ 2. `data-dismissible-hide`: attribute for the button to hide the HTML block.
46
+
47
+ For example:
48
+
49
+ <%= render_dismissible_block 'lorem' do %>
50
+ <div data-dismissible>
51
+ <p>...</p>
52
+ <a href="#" data-dismissible-hide>Hide</a>
53
+ </div>
54
+ <% end %>
55
+
56
+ Also make sure the [Cross-Site Request Forgery](http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf) (CSRF) token is included in your layout:
57
+
58
+ <%= csrf_meta_tags %>
59
+
60
+ ### JavaScript
61
+ Add the following JavaScript to `app/assets/javascripts/application.js`.
62
+
63
+ In its simplest form, you can require all the needed JavaScript using:
64
+
65
+ //= require jquery
66
+ //= require dismissible_blocks
67
+ //= require dismissible_blocks_loader
68
+
69
+ If you want to customize how a block of HTML is hidden using — for example — a slide up effect, you can customize the JavaScript like so:
70
+
71
+ //= require jquery
72
+ //= require dismissible_blocks
73
+
74
+ $(document).ready(function() {
75
+ $('[data-dismissible]').dismissible({
76
+ dismiss: function(helper) {
77
+ helper.slideUp();
78
+ }
79
+ });
80
+ });
81
+
82
+ ### Model
83
+
84
+ DismissibleBlocks saves the dismissed blocks on a model. It uses the `current_user` helper method to access the current user/account.
85
+
86
+ The model must have an attributed named `dismissed_blocks` and be of type Array.
87
+
88
+ #### ActiveRecord
89
+ ActiveRecord's serialization feature can achieve this. First, create a database migration to add the required field:
90
+
91
+ class AddDismissedBlocksToUsers < ActiveRecord::Migration
92
+ def up
93
+ add_column :users, :dismissed_blocks, :text
94
+ end
95
+
96
+ def down
97
+ remove_column :users, :dismissed_blocks
98
+ end
99
+ end
100
+
101
+ Then add the serialization to the model:
102
+
103
+ class User < ActiveRecord::Base
104
+ serialize :dismissed_blocks, Array
105
+ end
106
+
107
+ #### ActiveRecord (using PostgreSQL)
108
+ If you are using [PostgreSQL](http://www.postgresql.org/) with native array support using [PostgresExt](https://github.com/dockyard/postgres_ext), your database migration would simply be:
109
+
110
+ class AddDismissedBlocksToUsers < ActiveRecord::Migration
111
+ def up
112
+ add_column :users, :dismissed_blocks, :string, :array => true
113
+ end
114
+
115
+ def down
116
+ remove_column :users, :dismissed_blocks
117
+ end
118
+ end
119
+
120
+ #### Mongoid
121
+ To add MongoDB support using [Mongoid](mongoid.org), add this to the user/account model:
122
+
123
+ field :dismissed_blocks, type: Array, default: []
124
+
125
+ #### Helper Method Not `current_user`
126
+ By default, DismissibleBlocks saves the state to the database using the `current_user` helper method. If your user/account helper method is named something else — for example `current_employee`:
127
+
128
+ def current_employee
129
+ ...
130
+ end
131
+ helper_method :current_employee
132
+
133
+ Use `alias_method` to create an alias to your helper method; don't forget to also include `helper_method` to make your helper available from your views:
134
+
135
+ alias_method :current_user, :current_employee
136
+ helper_method :current_user
137
+
138
+ ## Author
139
+ [Patrick Bougie](http://patrickbougie.com/)
140
+
141
+
142
+ ## Contributing
143
+
144
+ 1. Fork DismissibleBlocks: `https://github.com/pbougie/dismissible_blocks`
145
+ 2. Create your feature branch: `git checkout -b new-feature`
146
+ 3. Commit your changes: `git commit -am 'New feature description'`
147
+ 4. Push to the branch: `git push origin new-feature`
148
+ 5. Create a new Pull Request on [GitHub](https://github.com/)
149
+
150
+
151
+ ## Legal
152
+ DismissibleBlocks is copyright © 2014 [Patrick Bougie](http://patrickbougie.com/). It is free software and may be redistributed under the terms specified in the LICENSE.text file.
data/Rakefile ADDED
@@ -0,0 +1,34 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'DismissibleBlocks'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+
34
+ task default: :test
@@ -0,0 +1,37 @@
1
+ (function() {
2
+ (function($) {
3
+
4
+ $.fn.dismissible = function(options) {
5
+ return this.each(function() {
6
+ var _this = $(this);
7
+ $('[data-dismissible-hide]', this).click(function(event) {
8
+ event.preventDefault();
9
+ return _this.dismiss(options);
10
+ })
11
+ });
12
+ };
13
+
14
+ return $.fn.dismiss = function(options) {
15
+ return $.ajax({
16
+ type: 'POST',
17
+ url: '/dismissible_blocks.json',
18
+ dataType: 'json',
19
+ contentType: 'application/json',
20
+ data: JSON.stringify({
21
+ block: $(this).attr('data-dismissible'),
22
+ authenticity_token: $('meta[name=csrf-token]').attr('content')
23
+ }),
24
+ success: (function(_this) {
25
+ return function() {
26
+ if ((options != null) && options.dismiss !== void 0) {
27
+ return options.dismiss(_this);
28
+ } else {
29
+ return $(_this).remove();
30
+ }
31
+ }
32
+ })(this)
33
+ });
34
+ };
35
+
36
+ })(jQuery);
37
+ }).call(this);
@@ -0,0 +1,3 @@
1
+ $(document).ready(function() {
2
+ $('[data-dismissible]').dismissible();
3
+ });
@@ -0,0 +1,3 @@
1
+ class DismissibleBlocksController < ApplicationController
2
+ include DismissibleBlocks::Controller
3
+ end
@@ -0,0 +1,3 @@
1
+ module DismissibleBlocksHelper
2
+ include DismissibleBlocks::Helper
3
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ post '/dismissible_blocks' => 'dismissible_blocks#create'
3
+ end
@@ -0,0 +1,18 @@
1
+ module DismissibleBlocks::Controller
2
+
3
+ def create
4
+ if current_user_available
5
+ current_user.dismissed_blocks += [ params[:block].to_s ]
6
+ current_user.save!
7
+ render :json => {}, :status => :ok
8
+ else
9
+ render :json => {}, :status => :unprocessable_entity
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def current_user_available
16
+ respond_to?(:current_user) && current_user.respond_to?(:dismissed_blocks)
17
+ end
18
+ end
@@ -0,0 +1,4 @@
1
+ module DismissibleBlocks
2
+ class Engine < ::Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,34 @@
1
+ module DismissibleBlocks::Helper
2
+
3
+ def render_dismissible_block(name, &block)
4
+ unless dismissed?(name)
5
+ if block_given?
6
+ contents = capture(&block)
7
+ add_block_name_to_attributes(contents, name)
8
+ else
9
+ raise DismissibleBlocks::ContentMissing
10
+ end
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def dismissed?(name)
17
+ if respond_to?(:current_user)
18
+ if !current_user.respond_to?(:dismissed_blocks)
19
+ raise DismissibleBlocks::AttributeUnavailable
20
+ elsif !current_user.dismissed_blocks.is_a?(Array)
21
+ raise DismissibleBlocks::AttributeNotArray
22
+ else
23
+ current_user.dismissed_blocks.include?(name)
24
+ end
25
+ else
26
+ raise DismissibleBlocks::ModelUnavailable
27
+ end
28
+ end
29
+
30
+ def add_block_name_to_attributes(contents, name)
31
+ contents.gsub! /(data-dismissible)(-hide)?(?!-)/, "\\1\\2='#{name}'"
32
+ contents.html_safe
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ module DismissibleBlocks
2
+ VERSION = '0.0.2'
3
+ end
@@ -0,0 +1,13 @@
1
+ require 'dismissible_blocks/engine'
2
+
3
+ module DismissibleBlocks
4
+ extend ActiveSupport::Autoload
5
+
6
+ class ModelUnavailable < StandardError; end
7
+ class AttributeUnavailable < StandardError; end
8
+ class AttributeNotArray < StandardError; end
9
+ class ContentMissing < StandardError; end
10
+
11
+ autoload :Controller
12
+ autoload :Helper
13
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+ require 'capybara/rails'
3
+
4
+ class ActionDispatch::IntegrationTest
5
+ include Capybara::DSL
6
+
7
+ def login(user)
8
+ visit login_path
9
+ fill_in 'Username', with: user.username
10
+ fill_in 'Password', with: user.password
11
+ click_button 'Login'
12
+ assert current_path == landing_path
13
+ assert page.has_content? 'You have been logged in.'
14
+ end
15
+
16
+ def logout
17
+ visit logout_path
18
+ assert current_path == login_path
19
+ assert page.has_content? 'You have been logged out.'
20
+ end
21
+ end
22
+
23
+ # Prevent database locks when testing AJAX features
24
+ # https://github.com/jnicklas/capybara#transactions-and-database-setup
25
+ class ActiveRecord::Base
26
+ mattr_accessor :shared_connection
27
+ @@shared_connection = nil
28
+
29
+ def self.connection
30
+ @@shared_connection || retrieve_connection
31
+ end
32
+ end
33
+ ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class DismissibleBlocksControllerTest < ActionController::TestCase
4
+
5
+ test "dismiss block via ajax" do
6
+ session[:username] = users(:one).username # Login
7
+ refute users(:one).dismissed_blocks.include?('lorem')
8
+ xhr :post, :create, block: 'lorem', format: 'json'
9
+ users(:one).reload
10
+ assert users(:one).dismissed_blocks.include?('lorem')
11
+ assert_response :ok
12
+ end
13
+
14
+ test "dismiss block fails via ajax; not logged in" do
15
+ xhr :post, :create, block: 'lorem', format: 'json'
16
+ assert_response :unprocessable_entity
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ require File.expand_path('../config/application', __FILE__)
2
+
3
+ Dummy::Application.load_tasks
@@ -0,0 +1,3 @@
1
+ //= require jquery
2
+ //= require dismissible_blocks
3
+ //= require dismissible_blocks_loader
@@ -0,0 +1,17 @@
1
+ /*
2
+ *= require_self
3
+ */
4
+
5
+ .flash, .block {
6
+ border: 2px solid #333;
7
+ padding: 10px 20px;
8
+ background-color: #eee;
9
+ }
10
+ .flash-alert {
11
+ border-color: #ebccd1;
12
+ background-color: #f2dede;
13
+ }
14
+ .flash-notice {
15
+ border-color: #bce8f1;
16
+ background-color: #d9edf7;
17
+ }
@@ -0,0 +1,29 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery with: :exception
3
+
4
+ def current_user
5
+ if session[:username].present?
6
+ @current_user ||= User.find_by(username: session[:username])
7
+ end
8
+ end
9
+ helper_method :current_user
10
+
11
+ def check_authentication
12
+ unless session[:username].present?
13
+ raise Dummy::Unauthorized
14
+ end
15
+ end
16
+
17
+ def authenticated?
18
+ session[:username].present?
19
+ end
20
+
21
+
22
+ def signin(username)
23
+ session[:username] = username
24
+ end
25
+
26
+ def signout
27
+ reset_session
28
+ end
29
+ end
@@ -0,0 +1,6 @@
1
+ class LandingsController < ApplicationController
2
+ before_filter :check_authentication
3
+
4
+ def show
5
+ end
6
+ end
@@ -0,0 +1,28 @@
1
+ class SessionsController < ApplicationController
2
+ before_filter :check_authentication, only: :destroy
3
+
4
+ def new
5
+ if authenticated?
6
+ flash[:notice] = 'You are already logged in.'
7
+ redirect_to landing_url
8
+ end
9
+ end
10
+
11
+ def create
12
+ user = User.authenticate params[:username], params[:password]
13
+ if user
14
+ signin user.username
15
+ flash[:notice] = 'You have been logged in.'
16
+ redirect_to landing_url
17
+ else
18
+ flash.now[:alert] = 'Your username and/or password are incorrect.'
19
+ render :new
20
+ end
21
+ end
22
+
23
+ def destroy
24
+ signout
25
+ flash[:notice] = 'You have been logged out.'
26
+ redirect_to login_url
27
+ end
28
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module LandingsHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module SessionsHelper
2
+ end
@@ -0,0 +1,9 @@
1
+ class User < ActiveRecord::Base
2
+ serialize :dismissed_blocks, Array
3
+
4
+ validates :username, uniqueness: true
5
+
6
+ def self.authenticate(username, password)
7
+ User.find_by username: username, password: password
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ <h1>Dummy</h1>
2
+
3
+ <%= render_dismissible_block 'lorem' do %>
4
+ <div class="block" data-dismissible>
5
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae.</p>
6
+ <p><a href="#" data-dismissible-hide>Hide</a></p>
7
+ </div>
8
+ <% end %>
9
+
10
+ <p><%= link_to 'Logout', logout_path %></p>
@@ -0,0 +1,18 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <%= stylesheet_link_tag 'application' %>
6
+ <%= javascript_include_tag 'application' %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+ <% flash.each do |name, message| %>
11
+ <%= content_tag :p, class: "flash flash-#{name}" do %>
12
+ <%= message %>
13
+ <% end %>
14
+ <% end %>
15
+
16
+ <%= yield %>
17
+ </body>
18
+ </html>
@@ -0,0 +1,15 @@
1
+ <%= form_tag login_path do %>
2
+ <p>
3
+ <%= label_tag :username %>
4
+ <%= text_field_tag :username, params[:username] %>
5
+ </p>
6
+
7
+ <p>
8
+ <%= label_tag :password %>
9
+ <%= password_field_tag :password %>
10
+ </p>
11
+
12
+ <p>
13
+ <%= submit_tag 'Login' %>
14
+ </p>
15
+ <% end %>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../config/boot'
3
+ require 'rake'
4
+ Rake.application.run
@@ -0,0 +1,10 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+ require 'rails/all'
3
+
4
+ Bundler.require(*Rails.groups)
5
+ require 'dismissible_blocks'
6
+
7
+ module Dummy
8
+ class Unauthorized < StandardError; end
9
+ class Application < Rails::Application; end
10
+ end
@@ -0,0 +1,4 @@
1
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
2
+
3
+ require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
4
+ $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
@@ -0,0 +1,11 @@
1
+ development:
2
+ adapter: sqlite3
3
+ database: db/development.sqlite3
4
+ pool: 5
5
+ timeout: 5000
6
+
7
+ test:
8
+ adapter: sqlite3
9
+ database: db/test.sqlite3
10
+ pool: 5
11
+ timeout: 5000
@@ -0,0 +1,3 @@
1
+ require File.expand_path('../application', __FILE__)
2
+
3
+ Dummy::Application.initialize!
@@ -0,0 +1,29 @@
1
+ Dummy::Application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # In the development environment your application's code is reloaded on
5
+ # every request. This slows down response time but is perfect for development
6
+ # since you don't have to restart the web server when you make code changes.
7
+ config.cache_classes = false
8
+
9
+ # Do not eager load code on boot.
10
+ config.eager_load = false
11
+
12
+ # Show full error reports and disable caching.
13
+ config.consider_all_requests_local = true
14
+ config.action_controller.perform_caching = false
15
+
16
+ # Don't care if the mailer can't send.
17
+ config.action_mailer.raise_delivery_errors = false
18
+
19
+ # Print deprecation notices to the Rails logger.
20
+ config.active_support.deprecation = :log
21
+
22
+ # Raise an error on page load if there are pending migrations
23
+ config.active_record.migration_error = :page_load
24
+
25
+ # Debug mode disables concatenation and preprocessing of assets.
26
+ # This option may cause significant delays in view rendering with a large
27
+ # number of complex assets.
28
+ config.assets.debug = true
29
+ end