Permalink
Browse files

Allow routing concerns to accept a callable

This allows us to make alterations to the generated routes based on the
scope of the current mapper, and otherwise allows us to move larger
blocks of concerns out of the routes file, altogether.
  • Loading branch information...
1 parent 30a8f0d commit 4037e31d8874250e485ca6a27bd792a3beb13f76 @ernie ernie committed Aug 22, 2012
@@ -1613,8 +1613,8 @@ module Concerns
# 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 @@ def concern(name, &block)
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 @@ def initialize(set) #:nodoc:
@concerns = {}
end
+ def current_scope
+ @scope
+ end
+
include Base
include HttpHelpers
include Redirection
@@ -358,6 +358,7 @@ def index() render :nothing => true 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
@@ -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 @@ def test_accessing_concern_from_resources_using_only_option
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

0 comments on commit 4037e31

Please sign in to comment.