rails_no_database_in_view 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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