Method: ActionDispatch::Routing::Mapper::Scoping#scope

Defined in:
lib/action_dispatch/routing/mapper.rb

#scope(*args) ⇒ Object

Used to scope a set of routes to particular constraints.

Take the following route definition as an example:

scope :path => ":account_id", :as => "account" do
  resources :projects
end

This generates helpers such as account_projects_path, just like resources does. The difference here being that the routes generated are like /rails/projects/2, rather than /accounts/rails/projects/2.

Supported options

:module

If you want to route /posts (without the prefix /admin) to Admin::PostsController, you could use

scope :module => "admin" do
  resources :posts
end
:path

If you want to prefix the route, you could use

scope :path => "/admin" do
  resources :posts
end

This will prefix all of the posts resource’s requests with ‘/admin’

:as

Prefixes the routing helpers in this scope with the specified label.

scope :as => "sekret" do
  resources :posts
end

Helpers such as posts_path will now be sekret_posts_path

:shallow_path

Prefixes nested shallow routes with the specified path.

scope :shallow_path => “sekret” do

resources :posts do
  resources :comments, :shallow => true
end

The comments resource here will have the following routes generated for it:

post_comments    GET    /sekret/posts/:post_id/comments(.:format)
post_comments    POST   /sekret/posts/:post_id/comments(.:format)
new_post_comment GET    /sekret/posts/:post_id/comments/new(.:format)
edit_comment     GET    /sekret/comments/:id/edit(.:format)
comment          GET    /sekret/comments/:id(.:format)
comment          PUT    /sekret/comments/:id(.:format)
comment          DELETE /sekret/comments/:id(.:format)


516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
# File 'lib/action_dispatch/routing/mapper.rb', line 516

def scope(*args)
  options = args.extract_options!
  options = options.dup

  if name_prefix = options.delete(:name_prefix)
    options[:as] ||= name_prefix
    ActiveSupport::Deprecation.warn ":name_prefix was deprecated in the new router syntax. Use :as instead.", caller
  end

  options[:path] = args.first if args.first.is_a?(String)
  recover = {}

  options[:constraints] ||= {}
  unless options[:constraints].is_a?(Hash)
    block, options[:constraints] = options[:constraints], {}
  end

  scope_options.each do |option|
    if value = options.delete(option)
      recover[option] = @scope[option]
      @scope[option]  = send("merge_#{option}_scope", @scope[option], value)
    end
  end

  recover[:block] = @scope[:blocks]
  @scope[:blocks] = merge_blocks_scope(@scope[:blocks], block)

  recover[:options] = @scope[:options]
  @scope[:options]  = merge_options_scope(@scope[:options], options)

  yield
  self
ensure
  scope_options.each do |option|
    @scope[option] = recover[option] if recover.has_key?(option)
  end

  @scope[:options] = recover[:options]
  @scope[:blocks]  = recover[:block]
end