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:
parent
30a8f0d5b6
commit
4037e31d88
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user