Skip to content

Commit

Permalink
Support constraints on resource custom params when nesting
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
pixeltrix committed Jul 20, 2012
1 parent 3b3ca13 commit 27619e3
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 9 deletions.
20 changes: 12 additions & 8 deletions actionpack/lib/action_dispatch/routing/mapper.rb
Expand Up @@ -917,7 +917,7 @@ def initialize(entities, options = {})
@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

Expand Down Expand Up @@ -969,8 +969,12 @@ def new_scope(new_path)
"#{path}/#{new_path}"
end

def nested_param
:"#{singular}_#{param}"
end

def nested_scope
"#{path}/:#{singular}_#{param}"
"#{path}/:#{nested_param}"
end

end
Expand Down Expand Up @@ -1481,18 +1485,18 @@ def resource_scope(kind, resource) #:nodoc:
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:
Expand Down
13 changes: 12 additions & 1 deletion actionpack/test/dispatch/routing_test.rb
Expand Up @@ -482,7 +482,7 @@ def self.call(params, request)
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
Expand Down Expand Up @@ -2243,6 +2243,17 @@ def test_custom_param
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?
Expand Down

0 comments on commit 27619e3

Please sign in to comment.