rails_no_database_in_view 0.0.1 → 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.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ rails_no_database_in_view
2
+ ===========
3
+
4
+ Prevent database access from the view.
5
+
6
+ Force loading all data from the controller by raising when the database
7
+ is accessed from the view. This can help create effective database
8
+ queries and help avoid SQL N+1 problems.
9
+
10
+ ## Installation
11
+
12
+ gem install rails_no_database_in_view
13
+
14
+ ## Usage
15
+
16
+ Enable in controller:
17
+
18
+ ```ruby
19
+ class ItemsController < ActionController::Base
20
+
21
+ no_database_access_from_view! if Rails.env.development?
22
+
23
+ ...
24
+
25
+ end
26
+ ```
27
+
28
+ If the database is accessed from the view, a DatabaseAccessFromViewError
29
+ will be raised.
30
+
31
+ ## Badness
32
+
33
+ You can't tell where in the view the exception came from. Yeah, that's pretty bad.
34
+
35
+ ## Disclaimer
36
+
37
+ Don't use this. It probably doesn't work. :)
@@ -0,0 +1,8 @@
1
+ require File.expand_path "./rails_no_database_in_view/version", File.dirname(__FILE__)
2
+ require File.expand_path "./rails_no_database_in_view/database_access_from_view_error", File.dirname(__FILE__)
3
+ require File.expand_path "./rails_no_database_in_view/controller_instance_methods", File.dirname(__FILE__)
4
+ require File.expand_path "./rails_no_database_in_view/controller_class_methods", File.dirname(__FILE__)
5
+ require File.expand_path "./rails_no_database_in_view/railtie", File.dirname(__FILE__)
6
+
7
+ module RailsNoDatabaseInView
8
+ end
@@ -0,0 +1,11 @@
1
+ module RailsNoDatabaseInView
2
+ module ControllerClassMethods
3
+
4
+ def no_database_access_from_view!
5
+ self.class_eval do
6
+ include ControllerInstanceMethods
7
+ end
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,58 @@
1
+ module RailsNoDatabaseInView
2
+ module ControllerInstanceMethods
3
+
4
+ def self.included base
5
+ base.instance_eval do
6
+ unless respond_to? :render_without_database_disconnected_for_rendering
7
+ alias_method :render_without_database_disconnected_for_rendering, :render
8
+ alias_method :render, :render_with_database_disconnected_for_rendering
9
+ end
10
+ end
11
+ end
12
+
13
+ def render_with_database_disconnected_for_rendering *args
14
+ with_database_disconnected_for_rendering do
15
+ render_without_database_disconnected_for_rendering *args
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def with_database_disconnected_for_rendering
22
+ retval = nil
23
+ begin
24
+ @no_db_inside_render_call ||= 0
25
+ @no_db_inside_render_call += 1
26
+ if @no_db_inside_render_call > 1
27
+ retval = yield
28
+ else
29
+ no_db_disconnect
30
+ begin
31
+ retval = yield
32
+ rescue StandardError => e
33
+ if e.class.to_s.include?('ActiveRecord::') || e.message['not connected'] || e.message['closed database']
34
+ raise DatabaseAccessFromViewError.new(e)
35
+ else
36
+ raise e
37
+ end
38
+ ensure
39
+ no_db_reconnect
40
+ end
41
+ end
42
+ ensure
43
+ @no_db_inside_render_call -= 1
44
+ end
45
+ retval
46
+ end
47
+
48
+ def no_db_disconnect
49
+ ActiveRecord::Base.connection.disconnect!
50
+ end
51
+
52
+ def no_db_reconnect
53
+ ActiveRecord::Base.connection.reconnect!
54
+ ActiveRecord::Base.establish_connection
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,16 @@
1
+ module RailsNoDatabaseInView
2
+ class DatabaseAccessFromViewError < StandardError
3
+
4
+ def initialize error
5
+ @error = error
6
+ end
7
+
8
+ def message
9
+ "A database call was made from the view.\n" \
10
+ "The database had been temporarily disable while rendering the view so we could catch situations like this.\n" \
11
+ "\nOriginal error:\n" \
12
+ "#{@error.message} (#{@error.class})"
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ module RailsNoDatabaseInView
2
+ class Railtie < Rails::Railtie
3
+ config.to_prepare do
4
+ ActionController::Base.extend ControllerClassMethods
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module RailsNoDatabaseInView
2
+ VERSION = "0.0.2"
3
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_no_database_in_view
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joel Plane
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2013-02-02 00:00:00 Z
18
+ date: 2013-02-03 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rspec
@@ -56,8 +56,14 @@ extensions: []
56
56
 
57
57
  extra_rdoc_files: []
58
58
 
59
- files: []
60
-
59
+ files:
60
+ - lib/rails_no_database_in_view/controller_class_methods.rb
61
+ - lib/rails_no_database_in_view/database_access_from_view_error.rb
62
+ - lib/rails_no_database_in_view/controller_instance_methods.rb
63
+ - lib/rails_no_database_in_view/version.rb
64
+ - lib/rails_no_database_in_view/railtie.rb
65
+ - lib/rails_no_database_in_view.rb
66
+ - README.md
61
67
  homepage: https://github.com/joelplane/rails_no_database_in_view
62
68
  licenses: []
63
69