lazy_crud 0.9.3 → 0.9.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +47 -16
- data/lib/lazy_crud/version.rb +1 -1
- data/lib/lazy_crud.rb +39 -0
- data/spec/integration/events_controller_spec.rb +51 -0
- data/spec/support/rails_app/app/controllers/events_controller.rb +9 -49
- data/spec/support/rails_app/db/development.sqlite3 +0 -0
- data/spec/unit/lazy_crud_spec.rb +25 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd3014b37d04ad90643b0d6a76b4226ff6744d95
|
4
|
+
data.tar.gz: 570152da372dbb3901ff85ea3d31f6a50b6e5177
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97e86b3f77c7539212b949b6ce4961f61fa1bc871e3421aa402f8f988b5a0a2feb2fe18134978e18ab164741a81f82133371b80b6e65d753f97d8e33f7d7ddc8
|
7
|
+
data.tar.gz: abf440e50d917d27016ba78fbe04fe374301c3638ed542cf78a1d408426a77e25e38f5f6597c9f85af074065e69f536f28aee041086d7aba50504c7391b3d340
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
# lazy_crud
|
1
|
+
# lazy_crud [![Join the chat at https://gitter.im/NullVoxPopuli/lazy_crud](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/NullVoxPopuli/lazy_crud?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
2
|
+
|
2
3
|
Lazy way to implement common actions in controllers in Rails
|
3
4
|
|
4
5
|
[![docs](https://img.shields.io/badge/docs-yardoc-blue.svg?style=flat-square)](http://www.rubydoc.info/github/NullVoxPopuli/lazy_crud)
|
@@ -35,31 +36,61 @@ Terminal
|
|
35
36
|
|
36
37
|
### Basic setup
|
37
38
|
|
39
|
+
Include all of the basic actions, `create`, `edit`, `destroy`, etc
|
40
|
+
|
38
41
|
class SomeObjectController < ApplicationController
|
39
42
|
include LazyCrud
|
40
43
|
|
41
|
-
|
42
|
-
|
44
|
+
At a bare minimum, you'll need to specify the class the controller is acting upon.
|
45
|
+
|
43
46
|
set_resource SomeObject
|
44
47
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
48
|
+
|
49
|
+
**Optional**
|
50
|
+
|
51
|
+
This is for in the case of you having nested routes, and want to scope
|
52
|
+
`SomeObject` to its parent object.
|
53
|
+
|
54
|
+
For example: `/event/:event_id/discounts/:id`
|
55
|
+
Event is the parent object and Discount is the resource
|
56
|
+
|
57
|
+
Note that there must be an `@event` instance variable set.
|
58
|
+
See specs for details.
|
59
|
+
|
54
60
|
set_resource_parent Event
|
55
61
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
62
|
+
**Sort of Optional**
|
63
|
+
|
64
|
+
If you want to be able to update / create objects, you'll want to
|
65
|
+
specify what parameters are allowed to be set.
|
66
|
+
This uses strong parameters.
|
67
|
+
|
60
68
|
set_param_whitelist(:name, :amount)
|
69
|
+
|
70
|
+
# ... other controller stuff
|
61
71
|
end
|
62
72
|
|
73
|
+
|
74
|
+
### CRUD-hooks
|
75
|
+
|
76
|
+
Sometimes you may want to manually assign attributes to an object before saving, such as current_user.
|
77
|
+
|
78
|
+
There are two ways to do this:
|
79
|
+
|
80
|
+
def before_create
|
81
|
+
@resource.user = current_user
|
82
|
+
end
|
83
|
+
|
84
|
+
or if you are wanting to have ruby throw an error if you spelled something wrong
|
85
|
+
|
86
|
+
before_create ->(resource){ resource.user = current_user }
|
87
|
+
|
88
|
+
the error thrown will be NoMethodError
|
89
|
+
|
90
|
+
Available CRUD-hooks are: `before_create`, `before_update`, `before_destroy`
|
91
|
+
|
92
|
+
Each hook can be called multiple times, and they will be invoked in the order they were defined. If the `def` method is used, it will be invoked last.
|
93
|
+
|
63
94
|
## Contributing
|
64
95
|
|
65
96
|
1. Fork the project
|
data/lib/lazy_crud/version.rb
CHANGED
data/lib/lazy_crud.rb
CHANGED
@@ -5,11 +5,18 @@ require 'lazy_crud/version'
|
|
5
5
|
module LazyCrud
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
|
+
ACTIONS_WITH_HOOKS = [:create, :update, :destroy]
|
9
|
+
|
8
10
|
included do
|
9
11
|
class_attribute :resource_class
|
10
12
|
class_attribute :parent_class
|
11
13
|
class_attribute :param_whitelist
|
12
14
|
|
15
|
+
# crud hooks
|
16
|
+
class_attribute :before_create_hooks
|
17
|
+
class_attribute :before_update_hooks
|
18
|
+
class_attribute :before_destroy_hooks
|
19
|
+
# setting instance variables for actions and views
|
13
20
|
before_action :set_resource, only: [:show, :edit, :update, :destroy]
|
14
21
|
before_action :set_resource_instance, only: [:show, :edit, :update, :destroy]
|
15
22
|
end
|
@@ -35,6 +42,35 @@ module LazyCrud
|
|
35
42
|
self.param_whitelist = param_list
|
36
43
|
end
|
37
44
|
|
45
|
+
ACTIONS_WITH_HOOKS.each do |action|
|
46
|
+
# adds a lambda to the hook array
|
47
|
+
define_method("before_#{action}") do |func|
|
48
|
+
hook_list = self.send("before_#{action}_hooks")
|
49
|
+
hook_list ||= []
|
50
|
+
hook_list << func
|
51
|
+
|
52
|
+
self.send("before_#{action}_hooks=", hook_list)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
ACTIONS_WITH_HOOKS.each do |action|
|
59
|
+
# runs all of the hooks
|
60
|
+
define_method("run_before_#{action}_hooks") do
|
61
|
+
hook_list = self.send("before_#{action}_hooks")
|
62
|
+
|
63
|
+
if hook_list
|
64
|
+
hook_list.each do |hook|
|
65
|
+
hook.call(@resource)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# run the before action method if it exists
|
70
|
+
if respond_to?("before_#{action}")
|
71
|
+
self.send("before_#{action}")
|
72
|
+
end
|
73
|
+
end
|
38
74
|
end
|
39
75
|
|
40
76
|
def index
|
@@ -59,6 +95,7 @@ module LazyCrud
|
|
59
95
|
# ensure we can still use model name-based instance variables
|
60
96
|
set_resource_instance
|
61
97
|
|
98
|
+
run_before_create_hooks
|
62
99
|
if @resource.save
|
63
100
|
flash[:notice] = "#{resource_name} has been created."
|
64
101
|
redirect_to action: :index
|
@@ -68,6 +105,7 @@ module LazyCrud
|
|
68
105
|
end
|
69
106
|
|
70
107
|
def update
|
108
|
+
run_before_update_hooks
|
71
109
|
if @resource.update(resource_params)
|
72
110
|
redirect_to action: :index
|
73
111
|
else
|
@@ -76,6 +114,7 @@ module LazyCrud
|
|
76
114
|
end
|
77
115
|
|
78
116
|
def destroy
|
117
|
+
run_before_destroy_hooks
|
79
118
|
@resource.destroy
|
80
119
|
|
81
120
|
flash[:notice] = "#{resource_name} has been deleted."
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe EventsController, type: :controller do
|
4
|
+
|
5
|
+
describe 'before_create' do
|
6
|
+
it 'has 2 hooks' do
|
7
|
+
hooks = controller.class.before_create_hooks
|
8
|
+
expect(hooks.count).to eq 2
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'calls before_create hooks' do
|
12
|
+
|
13
|
+
expect(controller).to receive(:before_create)
|
14
|
+
post :create, event: build(:event).attributes
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'evaluates the before_create hooks' do
|
18
|
+
attributes = build(:event).attributes
|
19
|
+
post :create, event: attributes
|
20
|
+
|
21
|
+
name = attributes["name"].upcase
|
22
|
+
expected = name + " " + name
|
23
|
+
actual = assigns(:event).name
|
24
|
+
expect(actual).to eq expected
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'before_update' do
|
29
|
+
|
30
|
+
it 'calls before_update hooks' do
|
31
|
+
event = create(:event)
|
32
|
+
put :update, id: event.id, event: {}
|
33
|
+
actual = assigns(:event).user_id
|
34
|
+
expect(actual).to eq -1
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'before_destroy' do
|
40
|
+
|
41
|
+
it 'calls before_destroy hooks' do
|
42
|
+
event = create(:event)
|
43
|
+
expect(event.created_at).to_not eq nil
|
44
|
+
delete :destroy, id: event.id
|
45
|
+
expect(assigns(:event).created_at).to eq nil
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
end
|
@@ -1,58 +1,18 @@
|
|
1
1
|
class EventsController < ApplicationController
|
2
|
-
|
2
|
+
include LazyCrud
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
@events = Event.all
|
7
|
-
end
|
8
|
-
|
9
|
-
# GET /events/1
|
10
|
-
def show
|
11
|
-
end
|
12
|
-
|
13
|
-
# GET /events/new
|
14
|
-
def new
|
15
|
-
@event = Event.new
|
16
|
-
end
|
4
|
+
set_resource Event
|
5
|
+
set_param_whitelist(:name)
|
17
6
|
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
# POST /events
|
23
|
-
def create
|
24
|
-
@event = Event.new(event_params)
|
7
|
+
before_create ->(resource){ resource.name = resource.name.upcase }
|
8
|
+
before_create ->(resource){}
|
25
9
|
|
26
|
-
|
27
|
-
|
28
|
-
else
|
29
|
-
render :new
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# PATCH/PUT /events/1
|
34
|
-
def update
|
35
|
-
if @event.update(event_params)
|
36
|
-
redirect_to @event, notice: 'Event was successfully updated.'
|
37
|
-
else
|
38
|
-
render :edit
|
39
|
-
end
|
40
|
-
end
|
10
|
+
before_update ->(resource){ resource.user_id = -1 }
|
11
|
+
before_destroy ->(resource){ resource.created_at = nil }
|
41
12
|
|
42
|
-
|
43
|
-
|
44
|
-
@event.destroy
|
45
|
-
redirect_to events_url, notice: 'Event was successfully destroyed.'
|
13
|
+
def before_create
|
14
|
+
@resource.name = @resource.name + " " + @resource.name
|
46
15
|
end
|
47
16
|
|
48
|
-
private
|
49
|
-
# Use callbacks to share common setup or constraints between actions.
|
50
|
-
def set_event
|
51
|
-
@event = Event.find(params[:id])
|
52
|
-
end
|
53
17
|
|
54
|
-
# Only allow a trusted parameter "white list" through.
|
55
|
-
def event_params
|
56
|
-
params[:event]
|
57
|
-
end
|
58
18
|
end
|
Binary file
|
data/spec/unit/lazy_crud_spec.rb
CHANGED
@@ -4,6 +4,11 @@ describe LazyCrud do
|
|
4
4
|
|
5
5
|
class Example < ActionController::Base
|
6
6
|
include LazyCrud
|
7
|
+
|
8
|
+
before_create -> (resource){ 2+2 }
|
9
|
+
before_update -> (resource){ 2+2 }
|
10
|
+
before_destroy -> (resource){ 2+2 }
|
11
|
+
|
7
12
|
end
|
8
13
|
|
9
14
|
|
@@ -19,4 +24,24 @@ describe LazyCrud do
|
|
19
24
|
end
|
20
25
|
|
21
26
|
|
27
|
+
context 'calling a hook adds it to the hook list' do
|
28
|
+
|
29
|
+
it 'before_create appends to the hook list' do
|
30
|
+
hooks = Example.before_create_hooks
|
31
|
+
expect(hooks.count).to eq 1
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'before_update appends to the hook list' do
|
35
|
+
hooks = Example.before_update_hooks
|
36
|
+
expect(hooks.count).to eq 1
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'before_destroy appends to the hook list' do
|
40
|
+
hooks = Example.before_destroy_hooks
|
41
|
+
expect(hooks.count).to eq 1
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
|
22
47
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lazy_crud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- L. Preston Sego III
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -197,6 +197,7 @@ files:
|
|
197
197
|
- lib/lazy_crud.rb
|
198
198
|
- lib/lazy_crud/version.rb
|
199
199
|
- spec/integration/discounts_controller_spec.rb
|
200
|
+
- spec/integration/events_controller_spec.rb
|
200
201
|
- spec/integration/users_controller_spec.rb
|
201
202
|
- spec/rails_helper.rb
|
202
203
|
- spec/spec_helper.rb
|
@@ -297,9 +298,10 @@ rubyforge_project:
|
|
297
298
|
rubygems_version: 2.4.6
|
298
299
|
signing_key:
|
299
300
|
specification_version: 4
|
300
|
-
summary: LazyCrud-0.9.
|
301
|
+
summary: LazyCrud-0.9.4
|
301
302
|
test_files:
|
302
303
|
- spec/integration/discounts_controller_spec.rb
|
304
|
+
- spec/integration/events_controller_spec.rb
|
303
305
|
- spec/integration/users_controller_spec.rb
|
304
306
|
- spec/rails_helper.rb
|
305
307
|
- spec/spec_helper.rb
|