josevalim-inherited_resources 0.6.2 → 0.6.3
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/CHANGELOG +13 -0
- data/README +2 -2
- data/lib/inherited_resources/base_helpers.rb +1 -1
- data/lib/inherited_resources/respond_to.rb +41 -14
- data/test/aliases_test.rb +12 -1
- data/test/respond_to_test.rb +37 -2
- data/test/views/projects/index.json.erb +1 -0
- data/test/views/projects/respond_to_skip_default_template.html.erb +1 -0
- metadata +4 -2
data/CHANGELOG
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Version 0.6
|
2
2
|
|
3
|
+
* Ensure that the default template is not rendered if the default_template_format
|
4
|
+
is not accepted. This is somehow related with the security breach report:
|
5
|
+
|
6
|
+
http://www.rorsecurity.info/journal/2009/4/24/hidden-actions-render-templates.html
|
7
|
+
|
8
|
+
IR forbids based on mime types. For example: respond_to :html, :except => :index
|
9
|
+
ensures that the index.html.erb view is not rendered, making your IR controllers
|
10
|
+
safer.
|
11
|
+
|
12
|
+
* Fixed a bug that happens only when format.xml is given to blocks and then it
|
13
|
+
acts as default, instead of format.html.
|
14
|
+
* Fixed a strange bug where when you have create.html.erb or update.html.erb,
|
15
|
+
it makes IE6 and IE7 return unprocessable entity (because they send Mime::ALL).
|
3
16
|
* Stop rescueing any error when constantizing the resource class and allow
|
4
17
|
route_prefix to be nil.
|
5
18
|
* Cleaned up tests and responder structure. Whenever you pass a block to aliases
|
data/README
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Inherited Resources
|
2
2
|
License: MIT
|
3
|
-
Version: 0.6.
|
3
|
+
Version: 0.6.3
|
4
4
|
|
5
5
|
You can also read this README in pretty html at the GitHub project Wiki page:
|
6
6
|
|
@@ -37,7 +37,7 @@ rspec-rails <= 1.1.12 known bug
|
|
37
37
|
-------------------------------
|
38
38
|
|
39
39
|
InheritedResources has a known bug with rspec-rails when using blocks inside
|
40
|
-
actions. This
|
40
|
+
actions. This is fixed in Rspec >= 1.2.0. But if you have to use 1.1.12, you
|
41
41
|
InheritedResources ships with a patch. To apply it, just put the line below on
|
42
42
|
your spec_helper.rb after loading rspec and rspec-rails:
|
43
43
|
|
@@ -245,7 +245,7 @@ module InheritedResources #:nodoc:
|
|
245
245
|
responder.respond_except_any
|
246
246
|
end
|
247
247
|
|
248
|
-
respond_to(options.merge(:responder => responder), &block) unless performed?
|
248
|
+
respond_to(options.merge!(:responder => responder, :prioritize => :html), &block) unless performed?
|
249
249
|
end
|
250
250
|
|
251
251
|
end
|
@@ -118,14 +118,15 @@ module ActionController #:nodoc:
|
|
118
118
|
def respond_with(object, options = {})
|
119
119
|
attempt_to_respond = false
|
120
120
|
|
121
|
-
responder
|
122
|
-
skip_not_acceptable
|
121
|
+
responder = options.delete(:responder) || Responder.new(self)
|
122
|
+
skip_not_acceptable = options.delete(:skip_not_acceptable)
|
123
|
+
skip_default_template = options.delete(:skip_default_template)
|
123
124
|
|
124
125
|
mime_types = Array(options.delete(:to))
|
125
126
|
mime_types.map!{ |mime| mime.to_sym }
|
126
127
|
|
127
128
|
for priority in responder.mime_type_priority
|
128
|
-
if priority == Mime::ALL &&
|
129
|
+
if !skip_default_template && priority == Mime::ALL && respond_to_default_template?(responder)
|
129
130
|
render options.merge(:action => action_name)
|
130
131
|
return true
|
131
132
|
|
@@ -195,11 +196,16 @@ module ActionController #:nodoc:
|
|
195
196
|
# format.html { render :template => 'new' }
|
196
197
|
# end
|
197
198
|
#
|
199
|
+
# It also accepts an option called prioritize. It allows you to put a
|
200
|
+
# format as first, and then when Mime::ALL is sent, it will be the one
|
201
|
+
# used as response.
|
202
|
+
#
|
198
203
|
def respond_to(*types, &block)
|
199
204
|
options = types.extract_options!
|
200
205
|
|
201
|
-
object
|
202
|
-
responder
|
206
|
+
object = options.delete(:with)
|
207
|
+
responder = options.delete(:responder) || Responder.new(self)
|
208
|
+
prioritize = options.delete(:prioritize)
|
203
209
|
|
204
210
|
if object.nil?
|
205
211
|
block ||= lambda { |responder| types.each { |type| responder.send(type) } }
|
@@ -215,11 +221,15 @@ module ActionController #:nodoc:
|
|
215
221
|
return true if responder.respond_except_any
|
216
222
|
end
|
217
223
|
|
218
|
-
|
224
|
+
# If the block includes the default template format, we don't render
|
225
|
+
# the default template (which uses the default_template_format).
|
226
|
+
options.merge!(:to => types, :responder => responder, :skip_not_acceptable => true,
|
227
|
+
:skip_default_template => responder.order.include?(default_template_format))
|
219
228
|
|
220
229
|
if respond_with(object, options)
|
221
230
|
return true
|
222
231
|
elsif block_given?
|
232
|
+
responder.prioritize(prioritize) if prioritize
|
223
233
|
return true if responder.respond_any
|
224
234
|
end
|
225
235
|
end
|
@@ -229,6 +239,7 @@ module ActionController #:nodoc:
|
|
229
239
|
end
|
230
240
|
|
231
241
|
private
|
242
|
+
|
232
243
|
# Define template_exists? for Rails 2.3
|
233
244
|
unless ActionController::Base.private_instance_methods.include?('template_exists?') ||
|
234
245
|
ActionController::Base.private_instance_methods.include?(:template_exists?)
|
@@ -240,20 +251,27 @@ module ActionController #:nodoc:
|
|
240
251
|
end
|
241
252
|
end
|
242
253
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
254
|
+
# We respond to the default template if it's a valid format AND the template
|
255
|
+
# exists.
|
256
|
+
#
|
257
|
+
def respond_to_default_template?(responder)
|
258
|
+
responder.action_respond_to_format?(default_template_format) && template_exists?
|
259
|
+
end
|
260
|
+
|
261
|
+
# If ApplicationController is already defined around here, we should call
|
262
|
+
# inherited_with_inheritable_attributes to insert formats_for_respond_to.
|
263
|
+
# This usually happens only on Rails 2.3.
|
264
|
+
#
|
265
|
+
if defined?(ApplicationController)
|
266
|
+
self.send(:inherited_with_inheritable_attributes, ApplicationController)
|
267
|
+
end
|
250
268
|
|
251
269
|
end
|
252
270
|
|
253
271
|
module MimeResponds #:nodoc:
|
254
272
|
class Responder #:nodoc:
|
255
273
|
|
256
|
-
attr_reader :mime_type_priority
|
274
|
+
attr_reader :mime_type_priority, :order
|
257
275
|
|
258
276
|
# Similar as respond but if we can't find a valid mime type, we do not
|
259
277
|
# send :not_acceptable message as head and it does not respond to
|
@@ -304,6 +322,15 @@ module ActionController #:nodoc:
|
|
304
322
|
end
|
305
323
|
end
|
306
324
|
|
325
|
+
# Makes a given format the first in the @order array.
|
326
|
+
#
|
327
|
+
def prioritize(format)
|
328
|
+
if index = @order.index(format)
|
329
|
+
@order.unshift(@order.delete_at(index))
|
330
|
+
end
|
331
|
+
@order
|
332
|
+
end
|
333
|
+
|
307
334
|
end
|
308
335
|
end
|
309
336
|
end
|
data/test/aliases_test.rb
CHANGED
@@ -20,6 +20,7 @@ class StudentsController < InheritedResources::Base
|
|
20
20
|
def create
|
21
21
|
create! do |success, failure|
|
22
22
|
success.html { render :text => "I won't redirect!" }
|
23
|
+
failure.xml { render :text => "I shouldn't be rendered" }
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
@@ -86,11 +87,21 @@ class AliasesTest < ActionController::TestCase
|
|
86
87
|
end
|
87
88
|
|
88
89
|
def test_dumb_responder_quietly_receives_everything_on_failure
|
90
|
+
@request.accept = 'text/html'
|
89
91
|
Student.stubs(:new).returns(mock_student(:save => false, :errors => []))
|
90
92
|
@controller.stubs(:resource_url).returns('http://test.host/')
|
91
93
|
post :create
|
92
94
|
assert_response :success
|
93
|
-
|
95
|
+
assert_equal "New HTML", @response.body.strip
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_html_is_the_default_when_only_xml_is_overwriten
|
99
|
+
@request.accept = '*/*'
|
100
|
+
Student.stubs(:new).returns(mock_student(:save => false, :errors => []))
|
101
|
+
@controller.stubs(:resource_url).returns('http://test.host/')
|
102
|
+
post :create
|
103
|
+
assert_response :success
|
104
|
+
assert_equal "New HTML", @response.body.strip
|
94
105
|
end
|
95
106
|
|
96
107
|
def test_wont_render_edit_template_on_update_with_failure_if_failure_block_is_given
|
data/test/respond_to_test.rb
CHANGED
@@ -17,11 +17,12 @@ end
|
|
17
17
|
class ProjectsController < ActionController::Base
|
18
18
|
# Inherited respond_to definition is:
|
19
19
|
# respond_to :html
|
20
|
-
respond_to :xml, :except => :edit
|
21
20
|
respond_to :html
|
21
|
+
respond_to :xml, :except => :edit
|
22
22
|
respond_to :rjs => :edit
|
23
23
|
respond_to :rss, :only => 'index'
|
24
24
|
respond_to :json, :except => :index
|
25
|
+
respond_to :csv, :except => :index
|
25
26
|
|
26
27
|
def index
|
27
28
|
respond_with(Project.new)
|
@@ -46,6 +47,16 @@ class ProjectsController < ActionController::Base
|
|
46
47
|
format.rss { render :text => 'Render RSS' }
|
47
48
|
end
|
48
49
|
end
|
50
|
+
|
51
|
+
# If the user request Mime::ALL and we have a template called action.html.erb,
|
52
|
+
# the html template should be rendered *unless* html is specified inside the
|
53
|
+
# block. This tests exactly this case.
|
54
|
+
#
|
55
|
+
def respond_to_skip_default_template
|
56
|
+
respond_to(:with => Project.new) do |format|
|
57
|
+
format.html { render :text => 'Render HTML' }
|
58
|
+
end
|
59
|
+
end
|
49
60
|
end
|
50
61
|
|
51
62
|
class SuperProjectsController < ProjectsController
|
@@ -149,6 +160,17 @@ class RespondToUnitTest < ActionController::TestCase
|
|
149
160
|
@responder.respond_any
|
150
161
|
assert !@performed
|
151
162
|
end
|
163
|
+
|
164
|
+
def test_responder_prioritize
|
165
|
+
prepare_responder_to_respond!
|
166
|
+
assert_equal [Mime::HTML, Mime::XML], @responder.order
|
167
|
+
|
168
|
+
@responder.prioritize(:xml)
|
169
|
+
assert_equal [Mime::XML, Mime::HTML], @responder.order
|
170
|
+
|
171
|
+
@responder.prioritize(:js)
|
172
|
+
assert_equal [Mime::XML, Mime::HTML], @responder.order
|
173
|
+
end
|
152
174
|
|
153
175
|
protected
|
154
176
|
def prepare_responder_to_respond!(content_type='*/*')
|
@@ -195,7 +217,7 @@ class RespondToFunctionalTest < ActionController::TestCase
|
|
195
217
|
end
|
196
218
|
|
197
219
|
def test_respond_with_renders_status_not_acceptable_if_mime_type_is_not_registered
|
198
|
-
@request.accept = '
|
220
|
+
@request.accept = 'text/csv'
|
199
221
|
get :index
|
200
222
|
assert_equal '406 Not Acceptable', @response.status
|
201
223
|
end
|
@@ -212,6 +234,13 @@ class RespondToFunctionalTest < ActionController::TestCase
|
|
212
234
|
assert_equal 'Index HTML', @response.body.strip
|
213
235
|
end
|
214
236
|
|
237
|
+
def test_default_template_is_not_rendered_if_template_format_is_not_accepted
|
238
|
+
@controller.stubs(:default_template_format).returns(:json)
|
239
|
+
@request.accept = '*/*'
|
240
|
+
get :index
|
241
|
+
assert_equal '406 Not Acceptable', @response.status
|
242
|
+
end
|
243
|
+
|
215
244
|
def test_respond_with_sets_content_type_properly
|
216
245
|
@request.accept = 'text/html'
|
217
246
|
get :index
|
@@ -276,4 +305,10 @@ class RespondToFunctionalTest < ActionController::TestCase
|
|
276
305
|
get :respond_to_with_resource_and_blocks
|
277
306
|
assert_equal 'Render JSON', @response.body.strip
|
278
307
|
end
|
308
|
+
|
309
|
+
def test_respond_to_skip_default_template_when_it_is_in_block
|
310
|
+
@request.accept = '*/*'
|
311
|
+
get :respond_to_skip_default_template
|
312
|
+
assert_equal 'Render HTML', @response.body.strip
|
313
|
+
end
|
279
314
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Index JSON
|
@@ -0,0 +1 @@
|
|
1
|
+
DefaultTemplate HTML
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: josevalim-inherited_resources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Jos\xC3\xA9 Valim"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-24 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -110,6 +110,8 @@ test_files:
|
|
110
110
|
- test/views/professors/new.html.erb
|
111
111
|
- test/views/professors/show.html.erb
|
112
112
|
- test/views/projects/index.html.erb
|
113
|
+
- test/views/projects/index.json.erb
|
114
|
+
- test/views/projects/respond_to_skip_default_template.html.erb
|
113
115
|
- test/views/projects/respond_to_with_resource.html.erb
|
114
116
|
- test/views/students/edit.html.erb
|
115
117
|
- test/views/students/new.html.erb
|