mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Support constraints on resource custom params when nesting
The Mapper looks for a :id constraint in the scope to see whether it should apply a constraint for nested resources. Since #5581 added support for resource params other than :id, we need to check for a constraint on the parent resource's param name and not assume it's :id.
This commit is contained in:
parent
3b3ca13307
commit
27619e34d4
2 changed files with 24 additions and 9 deletions
|
@ -917,7 +917,7 @@ module ActionDispatch
|
|||
@path = (options[:path] || @name).to_s
|
||||
@controller = (options[:controller] || @name).to_s
|
||||
@as = options[:as]
|
||||
@param = options[:param] || :id
|
||||
@param = (options[:param] || :id).to_sym
|
||||
@options = options
|
||||
end
|
||||
|
||||
|
@ -969,8 +969,12 @@ module ActionDispatch
|
|||
"#{path}/#{new_path}"
|
||||
end
|
||||
|
||||
def nested_param
|
||||
:"#{singular}_#{param}"
|
||||
end
|
||||
|
||||
def nested_scope
|
||||
"#{path}/:#{singular}_#{param}"
|
||||
"#{path}/:#{nested_param}"
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -1481,18 +1485,18 @@ module ActionDispatch
|
|||
def nested_options #:nodoc:
|
||||
options = { :as => parent_resource.member_name }
|
||||
options[:constraints] = {
|
||||
:"#{parent_resource.singular}_id" => id_constraint
|
||||
} if id_constraint?
|
||||
parent_resource.nested_param => param_constraint
|
||||
} if param_constraint?
|
||||
|
||||
options
|
||||
end
|
||||
|
||||
def id_constraint? #:nodoc:
|
||||
@scope[:constraints] && @scope[:constraints][:id].is_a?(Regexp)
|
||||
def param_constraint? #:nodoc:
|
||||
@scope[:constraints] && @scope[:constraints][parent_resource.param].is_a?(Regexp)
|
||||
end
|
||||
|
||||
def id_constraint #:nodoc:
|
||||
@scope[:constraints][:id]
|
||||
def param_constraint #:nodoc:
|
||||
@scope[:constraints][parent_resource.param]
|
||||
end
|
||||
|
||||
def canonical_action?(action, flag) #:nodoc:
|
||||
|
|
|
@ -482,7 +482,7 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
|
|||
get :preview, :on => :member
|
||||
end
|
||||
|
||||
resources :profiles, :param => :username do
|
||||
resources :profiles, :param => :username, :username => /[a-z]+/ do
|
||||
get :details, :on => :member
|
||||
resources :messages
|
||||
end
|
||||
|
@ -2243,6 +2243,17 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
|
|||
assert_equal '34', @request.params[:id]
|
||||
end
|
||||
|
||||
def test_custom_param_constraint
|
||||
get '/profiles/bob1'
|
||||
assert_equal 404, @response.status
|
||||
|
||||
get '/profiles/bob1/details'
|
||||
assert_equal 404, @response.status
|
||||
|
||||
get '/profiles/bob1/messages/34'
|
||||
assert_equal 404, @response.status
|
||||
end
|
||||
|
||||
private
|
||||
def with_https
|
||||
old_https = https?
|
||||
|
|
Loading…
Reference in a new issue