cancan_strong_parameters 0.1.4 → 0.1.5
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
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
CanCan and [strong_parameters](https://github.com/rails/strong_parameters) are friends now!
|
4
4
|
|
5
|
+
[](http://travis-ci.org/colinyoung/cancan_strong_parameters)
|
6
|
+
|
5
7
|
## Authors
|
6
8
|
|
7
9
|
The majority of this gem is credited to @mckeed, who posted this gist: https://gist.github.com/2878508
|
@@ -48,4 +50,8 @@ Run with `bundle exec rake test`.
|
|
48
50
|
## Changelog
|
49
51
|
|
50
52
|
* Fixed some issues with nested form subfields in `permit_params`
|
51
|
-
* Made compatible for nested forms
|
53
|
+
* Made compatible for nested forms
|
54
|
+
* Added default allows for _destroy.
|
55
|
+
* Tests pass in Travis.
|
56
|
+
* Fixes for irregular parameters posted like {"child_attributes" => {"0" => {}}}.
|
57
|
+
* Fixed a major security problem where I was manually inserting IDs - should be allowed by default, but not manually added
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module CancanStrongParameters
|
2
2
|
module Controller
|
3
3
|
|
4
|
-
HASH_DEFAULTS = [:_destroy, :_delete]
|
4
|
+
HASH_DEFAULTS = [:id, :_destroy, :_delete]
|
5
5
|
|
6
6
|
module ClassMethods
|
7
7
|
# Use this with CanCan's load_resource to permit a set of params before
|
@@ -76,7 +76,7 @@ module CancanStrongParameters
|
|
76
76
|
|
77
77
|
prepend_before_filter :only => actions do
|
78
78
|
resource_name = self.class.resource_name
|
79
|
-
self.params[resource_name] = params[resource_name].send method, *[*keys.flatten + @@defaults, @@hash]
|
79
|
+
self.params[resource_name] = params[resource_name].standardized.send method, *[*keys.flatten + @@defaults, @@hash]
|
80
80
|
end
|
81
81
|
elsif hash.present?
|
82
82
|
prepend_before_filter :only => actions do
|
@@ -119,13 +119,28 @@ class Hash
|
|
119
119
|
|
120
120
|
Hash.new.tap do |h|
|
121
121
|
self.each do |k,v|
|
122
|
-
h[:"#{k}_attributes"] = self
|
122
|
+
h[:"#{k}_attributes"] = self[k].attributized + defaults
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Converts keyed nested_forms (like task_attributes: {"0" => {}}) to normal params arrays.
|
128
|
+
def to_parameter_array
|
129
|
+
return self if self.empty?
|
130
|
+
|
131
|
+
return self unless (k = self.keys.first).is_a?(String) and k[0..3] == "new_" or k.is_i? or k.is_hex?
|
132
|
+
|
133
|
+
Array.new.tap do |a|
|
134
|
+
self.each do |k,v|
|
135
|
+
a << v.standardized
|
123
136
|
end
|
124
137
|
end
|
125
138
|
end
|
126
139
|
end
|
127
140
|
|
128
141
|
class Array
|
142
|
+
|
143
|
+
# Attributizes each element in an array
|
129
144
|
def attributized
|
130
145
|
Array.new.tap do |a|
|
131
146
|
self.each do |v|
|
@@ -134,4 +149,35 @@ class Array
|
|
134
149
|
end
|
135
150
|
end
|
136
151
|
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class ActiveSupport::HashWithIndifferentAccess
|
155
|
+
|
156
|
+
# Takes params that are passed in for nested_forms (like the example below) and cleans them up.
|
157
|
+
#
|
158
|
+
# post: {
|
159
|
+
# comments_attributes: {
|
160
|
+
# "0" => {},
|
161
|
+
# "1" => {},
|
162
|
+
# "new_23023032" => {}
|
163
|
+
# }
|
164
|
+
# }
|
165
|
+
#
|
166
|
+
def standardized
|
167
|
+
ActionController::Parameters.new.tap do |h|
|
168
|
+
self.each do |k,v|
|
169
|
+
h[k] = v.is_a?(Hash) ? v.to_parameter_array : v
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
class String
|
176
|
+
def is_i?
|
177
|
+
!!(self =~ /^[-+]?[0-9]+$/)
|
178
|
+
end
|
179
|
+
|
180
|
+
def is_hex?
|
181
|
+
!!(self =~ /^[0-9a-f]+$/)
|
182
|
+
end
|
137
183
|
end
|
data/test/app/models/post.rb
CHANGED
@@ -42,4 +42,87 @@ class PostsControllerTest < ActionController::TestCase
|
|
42
42
|
ActiveSupport::HashWithIndifferentAccess.new(assigns(:post_attributes)),
|
43
43
|
ActiveSupport::HashWithIndifferentAccess.new(params[:post])
|
44
44
|
end
|
45
|
+
|
46
|
+
test "can handle multiple items" do
|
47
|
+
params = {
|
48
|
+
post: {
|
49
|
+
title: "Hello",
|
50
|
+
comments_attributes: {
|
51
|
+
"0" => {
|
52
|
+
body: "Comment 1",
|
53
|
+
tags_attributes: {
|
54
|
+
"0" => {
|
55
|
+
name: "article"
|
56
|
+
},
|
57
|
+
"1" => {
|
58
|
+
name: "post"
|
59
|
+
},
|
60
|
+
}
|
61
|
+
},
|
62
|
+
"1" => {
|
63
|
+
body: "Comment 2"
|
64
|
+
},
|
65
|
+
"new_3904949" => {
|
66
|
+
body: "Comment 3"
|
67
|
+
}
|
68
|
+
}
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
post :create, params
|
73
|
+
assert_equal \
|
74
|
+
ActiveSupport::HashWithIndifferentAccess.new(assigns(:post_attributes)),
|
75
|
+
ActiveSupport::HashWithIndifferentAccess.new({
|
76
|
+
title: "Hello",
|
77
|
+
comments_attributes: [
|
78
|
+
{
|
79
|
+
body: "Comment 1",
|
80
|
+
tags_attributes: [{
|
81
|
+
name: "article"
|
82
|
+
},
|
83
|
+
{
|
84
|
+
name: "post"
|
85
|
+
}
|
86
|
+
]
|
87
|
+
},
|
88
|
+
{
|
89
|
+
body: "Comment 2"
|
90
|
+
},
|
91
|
+
{
|
92
|
+
body: "Comment 3"
|
93
|
+
}
|
94
|
+
]
|
95
|
+
})
|
96
|
+
end
|
97
|
+
|
98
|
+
test "can handle multiple items but with only new itesm" do
|
99
|
+
params = {
|
100
|
+
post: {
|
101
|
+
title: "Hello",
|
102
|
+
comments_attributes: {
|
103
|
+
"new_3904949" => {
|
104
|
+
body: "Comment 3",
|
105
|
+
tags_attributes: {
|
106
|
+
"new_23040234" => {
|
107
|
+
name: "article"
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
}
|
112
|
+
}
|
113
|
+
}
|
114
|
+
|
115
|
+
post :create, params
|
116
|
+
assert_equal \
|
117
|
+
ActiveSupport::HashWithIndifferentAccess.new(assigns(:post_attributes)),
|
118
|
+
ActiveSupport::HashWithIndifferentAccess.new({
|
119
|
+
title: "Hello",
|
120
|
+
comments_attributes: [{
|
121
|
+
body: "Comment 3",
|
122
|
+
tags_attributes: [{
|
123
|
+
name: "article"
|
124
|
+
}]
|
125
|
+
}]
|
126
|
+
})
|
127
|
+
end
|
45
128
|
end
|