aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/lib/action_dispatch/routing/mapper.rb10
-rw-r--r--actionpack/test/abstract_unit.rb1
-rw-r--r--actionpack/test/dispatch/routing/concerns_test.rb28
3 files changed, 34 insertions, 5 deletions
diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb
index b52f66faf1..b1abbbe505 100644
--- a/actionpack/lib/action_dispatch/routing/mapper.rb
+++ b/actionpack/lib/action_dispatch/routing/mapper.rb
@@ -1613,8 +1613,8 @@ module ActionDispatch
# end
#
# Any routing helpers can be used inside a concern.
- def concern(name, &block)
- @concerns[name] = block
+ def concern(name, callable = nil, &block)
+ @concerns[name] = callable || block
end
# Use the named concerns
@@ -1631,7 +1631,7 @@ module ActionDispatch
def concerns(*names)
names.flatten.each do |name|
if concern = @concerns[name]
- instance_eval(&concern)
+ concern.call(self)
else
raise ArgumentError, "No concern named #{name} was found!"
end
@@ -1645,6 +1645,10 @@ module ActionDispatch
@concerns = {}
end
+ def current_scope
+ @scope
+ end
+
include Base
include HttpHelpers
include Redirection
diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb
index e5054a9eb8..4f5b2895c9 100644
--- a/actionpack/test/abstract_unit.rb
+++ b/actionpack/test/abstract_unit.rb
@@ -358,6 +358,7 @@ end
class ThreadsController < ResourcesController; end
class MessagesController < ResourcesController; end
class CommentsController < ResourcesController; end
+class ReviewsController < ResourcesController; end
class AuthorsController < ResourcesController; end
class LogosController < ResourcesController; end
diff --git a/actionpack/test/dispatch/routing/concerns_test.rb b/actionpack/test/dispatch/routing/concerns_test.rb
index 21da3bd77a..8600da32ad 100644
--- a/actionpack/test/dispatch/routing/concerns_test.rb
+++ b/actionpack/test/dispatch/routing/concerns_test.rb
@@ -1,6 +1,16 @@
require 'abstract_unit'
class RoutingConcernsTest < ActionDispatch::IntegrationTest
+ class Reviewable
+ def self.call(mapper)
+ if mapper.current_scope[:controller] == 'posts'
+ mapper.resources :reviews
+ elsif mapper.current_scope[:controller] == 'videos'
+ mapper.resources :reviews, as: :video_reviews
+ end
+ end
+ end
+
Routes = ActionDispatch::Routing::RouteSet.new.tap do |app|
app.draw do
concern :commentable do
@@ -11,8 +21,10 @@ class RoutingConcernsTest < ActionDispatch::IntegrationTest
resources :images, only: :index
end
- resources :posts, concerns: [:commentable, :image_attachable] do
- resource :video, concerns: :commentable
+ concern :reviewable, Reviewable
+
+ resources :posts, concerns: [:commentable, :image_attachable, :reviewable] do
+ resource :video, concerns: [:commentable, :reviewable]
end
resource :picture, concerns: :commentable do
@@ -63,6 +75,18 @@ class RoutingConcernsTest < ActionDispatch::IntegrationTest
assert_equal "404", @response.code
end
+ def test_accessing_callable_concern_from_resources
+ get "/posts/1/reviews/1"
+ assert_equal "200", @response.code
+ assert_equal "/posts/1/reviews/1", post_review_path(post_id: 1, id: 1)
+ end
+
+ def test_callable_concern_can_adapt_to_mapper
+ get "/posts/1/video/reviews/1"
+ assert_equal "200", @response.code
+ assert_equal "/posts/1/video/reviews/1", post_video_video_review_path(post_id: 1, id: 1)
+ end
+
def test_accessing_concern_from_a_scope
get "/videos/comments"
assert_equal "200", @response.code