Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Generate shallow paths for all children of shallow resources.

Prior to this commit shallow resources would only generate paths for
non-direct children (with a nested depth greater than 1).

Take the following routes file.

    resources :blogs do
      resources :posts, shallow: true do
        resources :comments do
          resources :tags
        end
      end
    end

This would generate shallow paths for `tags` nested under `posts`,
e.g `/posts/:id/tags/`, however it would not generate shallow paths
for `comments` nested under `posts`, e.g `/posts/:id/comments/new`.

This commit changes the behaviour of the route mapper so that it
generate paths for direct children of shallow resources, for example
if you take the previous routes file, this will now generate
shallow paths for `comments` nested under `posts`, .e.g
`posts/:id/comments/new`.

This was the behaviour in Rails `4.0.4` however this was broken in
@jcoglan's fix for another routes related issue[1].

This also fixes an issue[2] reported by @smdern.

[1] d0e5963
[2] #15783

(cherry picked from commit e972d34)

Conflicts:
	actionpack/CHANGELOG.md
  • Loading branch information...
commit 1d94fa0de3fdc8d2dbc60aacdd168a4f2dea146e 1 parent 39a67ce
@sebjacobs sebjacobs authored pixeltrix committed
View
6 actionpack/CHANGELOG.md
@@ -1,3 +1,9 @@
+* Generate shallow paths for all children of shallow resources.
+
+ Fixes #15783.
+
+ *Seb Jacobs*
+
* JSONP responses are now rendered with the `text/javascript` content type
when rendering through a `respond_to` block.
View
2  actionpack/lib/action_dispatch/routing/mapper.rb
@@ -1388,7 +1388,7 @@ def nested
end
with_scope_level(:nested) do
- if shallow? && shallow_nesting_depth > 1
+ if shallow? && shallow_nesting_depth >= 1
shallow_scope(parent_resource.nested_scope, nested_options) { yield }
else
scope(parent_resource.nested_scope, nested_options) { yield }
View
22 actionpack/test/dispatch/routing_test.rb
@@ -2012,6 +2012,28 @@ def test_shallow_deeply_nested_resources
assert_equal '/blogs/1/posts/2/comments/new', new_blog_post_comment_path(:blog_id => 1, :post_id => 2)
end
+ def test_direct_children_of_shallow_resources
+ draw do
+ resources :blogs do
+ resources :posts, shallow: true do
+ resources :comments
+ end
+ end
+ end
+
+ post '/posts/1/comments'
+ assert_equal 'comments#create', @response.body
+ assert_equal '/posts/1/comments', post_comments_path('1')
+
+ get '/posts/2/comments/new'
+ assert_equal 'comments#new', @response.body
+ assert_equal '/posts/2/comments/new', new_post_comment_path('2')
+
+ get '/posts/1/comments'
+ assert_equal 'comments#index', @response.body
+ assert_equal '/posts/1/comments', post_comments_path('1')
+ end
+
def test_shallow_nested_resources_within_scope
draw do
scope '/hello' do
Please sign in to comment.
Something went wrong with that request. Please try again.