mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Routes may be restricted to lists of HTTP methods instead of a single method or :any.
[#407 state:resolved] Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
This commit is contained in:
parent
7bdd5b768e
commit
9cc8c0a0a1
4 changed files with 37 additions and 6 deletions
|
@ -1,5 +1,9 @@
|
|||
*Edge*
|
||||
|
||||
* Routes may be restricted to lists of HTTP methods instead of a single method or :any. #407 [Brennan Dunn, Gaius Centus Novus]
|
||||
map.resource :posts, :collection => { :search => [:get, :post] }
|
||||
map.session 'session', :requirements => { :method => [:get, :post, :delete] }
|
||||
|
||||
* Deprecated implicit local assignments when rendering partials [Josh Peek]
|
||||
|
||||
* Introduce current_cycle helper method to return the current value without bumping the cycle. #417 [Ken Collins]
|
||||
|
|
|
@ -187,12 +187,14 @@ module ActionController
|
|||
private
|
||||
def validate_route_conditions(conditions)
|
||||
if method = conditions[:method]
|
||||
if method == :head
|
||||
raise ArgumentError, "HTTP method HEAD is invalid in route conditions. Rails processes HEAD requests the same as GETs, returning just the response headers"
|
||||
end
|
||||
[method].flatten.each do |m|
|
||||
if m == :head
|
||||
raise ArgumentError, "HTTP method HEAD is invalid in route conditions. Rails processes HEAD requests the same as GETs, returning just the response headers"
|
||||
end
|
||||
|
||||
unless HTTP_METHODS.include?(method.to_sym)
|
||||
raise ArgumentError, "Invalid HTTP method specified in route conditions: #{conditions.inspect}"
|
||||
unless HTTP_METHODS.include?(m.to_sym)
|
||||
raise ArgumentError, "Invalid HTTP method specified in route conditions: #{conditions.inspect}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -201,7 +201,7 @@ module ActionController
|
|||
# recognition, not generation.
|
||||
def recognition_conditions
|
||||
result = ["(match = #{Regexp.new(recognition_pattern).inspect}.match(path))"]
|
||||
result << "conditions[:method] === env[:method]" if conditions[:method]
|
||||
result << "[conditions[:method]].flatten.include?(env[:method])" if conditions[:method]
|
||||
result
|
||||
end
|
||||
|
||||
|
|
|
@ -1297,6 +1297,31 @@ uses_mocha 'LegacyRouteSet, Route, RouteSet and RouteLoading' do
|
|||
end
|
||||
end
|
||||
|
||||
def test_recognize_array_of_methods
|
||||
begin
|
||||
Object.const_set(:BooksController, Class.new(ActionController::Base))
|
||||
rs.draw do |r|
|
||||
r.connect '/match', :controller => 'books', :action => 'get_or_post', :conditions => { :method => [:get, :post] }
|
||||
r.connect '/match', :controller => 'books', :action => 'not_get_or_post'
|
||||
end
|
||||
|
||||
@request = ActionController::TestRequest.new
|
||||
@request.env["REQUEST_METHOD"] = 'POST'
|
||||
@request.request_uri = "/match"
|
||||
assert_nothing_raised { rs.recognize(@request) }
|
||||
assert_equal 'get_or_post', @request.path_parameters[:action]
|
||||
|
||||
# have to recreate or else the RouteSet uses a cached version:
|
||||
@request = ActionController::TestRequest.new
|
||||
@request.env["REQUEST_METHOD"] = 'PUT'
|
||||
@request.request_uri = "/match"
|
||||
assert_nothing_raised { rs.recognize(@request) }
|
||||
assert_equal 'not_get_or_post', @request.path_parameters[:action]
|
||||
ensure
|
||||
Object.send(:remove_const, :BooksController) rescue nil
|
||||
end
|
||||
end
|
||||
|
||||
def test_subpath_recognized
|
||||
Object.const_set(:SubpathBooksController, Class.new(ActionController::Base))
|
||||
|
||||
|
|
Loading…
Reference in a new issue