assigns_has_many_through_relations 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +36 -1
- data/lib/assigns_has_many_through_relations.rb +1 -1
- data/lib/assigns_has_many_through_relations/configuration.rb +60 -0
- data/lib/assigns_has_many_through_relations/controller_concern.rb +16 -3
- data/lib/assigns_has_many_through_relations/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 308f5f480e2b83971454b1f22f1117aa9b704ba2
|
4
|
+
data.tar.gz: 87e6562f11300bcea323e389237ceed5c8911a91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a7375183004ea1e720ce949abe702219b362ea53d99132a02dad725c3f1de5a1117196303f9e6055cf03e60647422b04a87c2888647b0606fd07ce02476e36d
|
7
|
+
data.tar.gz: 6d2a10591c8580f78d43839e6ba9eaf087e19a711a49f59abeb2d883eb4b26cde2282d4aba4f4c73be5aea53269a30c4f38d9cc38041a53cb94390a05ae883f8
|
data/README.md
CHANGED
@@ -77,19 +77,54 @@ Finally, render the management UI partial in a view template in `app/views/locat
|
|
77
77
|
|
78
78
|
You'll have to provide the user with a link to `locations_users_path`. And that's it. Now you'll be able to assign and unassign `User`s to `Location`s.
|
79
79
|
|
80
|
-
|
80
|
+
**Note:** _currently the left side model has to respond_to `name` for a nice display name, and the right side model has to respond to `full_name`. This will be configurable soon._
|
81
|
+
|
82
|
+
## Configuration
|
83
|
+
|
84
|
+
You can configure the engine in an initializer. The given examples are the defaults except for `auth_filter`. That won't run if you don't set it.
|
81
85
|
|
82
86
|
```ruby
|
83
87
|
# config/initializers/assigns_has_many_through_relations.rb
|
84
88
|
|
85
89
|
AHMTR.configure do
|
90
|
+
# A controller authorization method to call as you would a controller macro.
|
91
|
+
#
|
92
|
+
# e.g like Cancan's authorize_resource (https://github.com/CanCanCommunity/cancancan/wiki/Authorizing-Controller-Actions)
|
86
93
|
auth_filter :authorize_resource
|
94
|
+
|
95
|
+
# The scope that loads the left side models.
|
96
|
+
#
|
97
|
+
# e.g. in the case where you declare assigns_has_many_relationships_with :location, :user
|
98
|
+
# then this scope would essentially load:
|
99
|
+
# Location.all
|
100
|
+
left_relation_scope do |left_relation_class, current_user|
|
101
|
+
left_relation_class.all
|
102
|
+
end
|
103
|
+
|
104
|
+
# The scope that loads the selected left side model's right relations.
|
105
|
+
#
|
106
|
+
# e.g. in the case where you declare assigns_has_many_relationships_with :location, :user
|
107
|
+
# then this scope would essentially load:
|
108
|
+
# @location.users
|
109
|
+
selected_right_relation_scope do |left_side_model, right_relation_class, current_user|
|
110
|
+
left_side_model.users
|
111
|
+
end
|
112
|
+
|
113
|
+
# The scope that loads all the non selected left side model's right relations.
|
114
|
+
#
|
115
|
+
# e.g. in the case where you declare assigns_has_many_relationships_with :location, :user
|
116
|
+
# then this scope would essentially load:
|
117
|
+
# User.all - @location.users
|
118
|
+
available_right_relation_scope do |right_relation_class, right_models, current_user|
|
119
|
+
right_relation_class.all - right_models
|
120
|
+
end
|
87
121
|
end
|
88
122
|
```
|
89
123
|
|
90
124
|
## Todo
|
91
125
|
|
92
126
|
1. Write specs.
|
127
|
+
2. Configurable model name method.
|
93
128
|
|
94
129
|
## Contributing
|
95
130
|
|
@@ -1,10 +1,70 @@
|
|
1
1
|
module AssignsHasManyThroughRelations
|
2
2
|
class Configuration
|
3
|
+
PROPERTIES = %w[
|
4
|
+
auth_filter
|
5
|
+
left_relation_scope
|
6
|
+
selected_right_relation_scope
|
7
|
+
available_right_relation_scope
|
8
|
+
]
|
9
|
+
|
3
10
|
# Assign the name of a controller class method that you want to run for authorization
|
4
11
|
# e.g. Cancan's :load_and_authorize_resource, or a custom method you define
|
5
12
|
# in your ApplicationController
|
6
13
|
def auth_filter(val = nil)
|
7
14
|
@auth_filter ||= val
|
8
15
|
end
|
16
|
+
|
17
|
+
# Set a block that will return an ActiveRecord scope of the left side models.
|
18
|
+
# the block will receive 2 arguments when it is called in the index action:
|
19
|
+
# left_relation_class: class of the left side relation
|
20
|
+
# user: the current user
|
21
|
+
def left_relation_scope(&block)
|
22
|
+
@left_relation_scope ||= block_given? ? block : method(:default_left_relation_scope)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Set a block that will return an ActiveRecord scope of the selected left side model's
|
26
|
+
# right side relations. The block will receive 2 arguments when it is called in the
|
27
|
+
# index action:
|
28
|
+
# left_side_model: the selected left side model
|
29
|
+
# right_relation_class: class of the right side relation
|
30
|
+
# user: the current user
|
31
|
+
def selected_right_relation_scope(&block)
|
32
|
+
@selected_right_relation_scope ||= block_given? ? block : method(:default_selected_right_relation_scope)
|
33
|
+
end
|
34
|
+
|
35
|
+
def available_right_relation_scope(&block)
|
36
|
+
@available_right_relation_scope ||= block_given? ? block : method(:default_available_right_relation_scope)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# The default scope just loads all of the left side models
|
42
|
+
#
|
43
|
+
# e.g. n the case where you declare assigns_has_many_relationships_with :location, :user
|
44
|
+
# then the scope would essentially load:
|
45
|
+
# Location.all
|
46
|
+
def default_left_relation_scope(left_relation_class, user)
|
47
|
+
left_relation_class.all
|
48
|
+
end
|
49
|
+
|
50
|
+
# The default selected right relation scope loads all of the selected left model's
|
51
|
+
# right side relations.
|
52
|
+
#
|
53
|
+
# e.g. in the case where you declare assigns_has_many_relationships_with :location, :user
|
54
|
+
# then this scope would essentially load:
|
55
|
+
# @location.users
|
56
|
+
def default_selected_right_relation_scope(left_side_model, right_relation_class, user)
|
57
|
+
left_model.send right_relation_class.name.demodulize.underscore.pluralize
|
58
|
+
end
|
59
|
+
|
60
|
+
# The default available right relation scope loads all of the right relation model
|
61
|
+
# except for the selected right models returned by selected_right_relation_scope
|
62
|
+
#
|
63
|
+
# e.g. in the case where you declare assigns_has_many_relationships_with :location, :user
|
64
|
+
# then this scope would essentially load:
|
65
|
+
# User.all - @location.users
|
66
|
+
def default_available_right_relation_scope(right_relation_class, right_models, user)
|
67
|
+
right_relation_class.all - right_models
|
68
|
+
end
|
9
69
|
end
|
10
70
|
end
|
@@ -22,11 +22,24 @@ module AssignsHasManyThroughRelations
|
|
22
22
|
|
23
23
|
module ControllerInstanceMethods
|
24
24
|
def index
|
25
|
-
@left_side_models =
|
25
|
+
@left_side_models = AHMTR.left_relation_scope.call(
|
26
|
+
self.class.left_relation_class,
|
27
|
+
current_user
|
28
|
+
)
|
26
29
|
@selected_left_side_model = self.class.left_relation_class.find params[:id]
|
27
30
|
@left_side_models = @left_side_models - [@selected_left_side_model]
|
28
|
-
|
29
|
-
@
|
31
|
+
|
32
|
+
@selected_right_side_models = AHMTR.selected_right_relation_scope.call(
|
33
|
+
@selected_left_side_model,
|
34
|
+
self.class.right_relation_class,
|
35
|
+
current_user
|
36
|
+
)
|
37
|
+
|
38
|
+
@available_right_side_models = AHMTR.available_right_relation_scope.call(
|
39
|
+
self.class.right_relation_class,
|
40
|
+
@selected_right_side_models,
|
41
|
+
current_user
|
42
|
+
)
|
30
43
|
end
|
31
44
|
|
32
45
|
def update
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: assigns_has_many_through_relations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Diego Salazar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|