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.
This commit is contained in:
Ernie Miller 2012-08-22 10:27:42 -04:00
parent 30a8f0d5b6
commit 4037e31d88
3 changed files with 34 additions and 5 deletions

@ -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