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 +37 -0
- data/lib/rails_no_database_in_view.rb +8 -0
- data/lib/rails_no_database_in_view/controller_class_methods.rb +11 -0
- data/lib/rails_no_database_in_view/controller_instance_methods.rb +58 -0
- data/lib/rails_no_database_in_view/database_access_from_view_error.rb +16 -0
- data/lib/rails_no_database_in_view/railtie.rb +7 -0
- data/lib/rails_no_database_in_view/version.rb +3 -0
- metadata +12 -6
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,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
|
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:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
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-
|
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
|
|