From d01716731bd9c68de686d6ac85e3da5251305495 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Wed, 13 Jan 2010 17:23:14 -0600 Subject: Add router support for resources :only and :except actions --- actionpack/lib/action_dispatch/routing/mapper.rb | 54 +++++++++++++++++------- actionpack/test/dispatch/routing_test.rb | 18 ++++++++ 2 files changed, 56 insertions(+), 16 deletions(-) (limited to 'actionpack') diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 48fb7edd67..5009ed001c 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -324,7 +324,11 @@ module ActionDispatch CRUD_ACTIONS = [:index, :show, :new, :edit, :create, :update, :destroy] class Resource #:nodoc: - attr_reader :plural, :singular + def self.default_actions + [:index, :create, :new, :show, :update, :destroy, :edit] + end + + attr_reader :plural, :singular, :options def initialize(entities, options = {}) entities = entities.to_s @@ -334,8 +338,22 @@ module ActionDispatch @singular = entities.singularize end + def default_actions + self.class.default_actions + end + + def actions + if only = options[:only] + only.map(&:to_sym) + elsif except = options[:except] + default_actions - except.map(&:to_sym) + else + default_actions + end + end + def name - @options[:as] || plural + options[:as] || plural end def controller @@ -356,12 +374,16 @@ module ActionDispatch end class SingletonResource < Resource #:nodoc: + def self.default_actions + [:show, :create, :update, :destroy, :new, :edit] + end + def initialize(entity, options = {}) super end def name - @options[:as] || singular + options[:as] || singular end end @@ -387,12 +409,12 @@ module ActionDispatch with_scope_level(:resource, resource) do yield if block_given? - get "(.:format)", :to => :show, :as => resource.member_name - post "(.:format)", :to => :create - put "(.:format)", :to => :update - delete "(.:format)", :to => :destroy - get "/new(.:format)", :to => :new, :as => "new_#{resource.singular}" - get "/edit(.:format)", :to => :edit, :as => "edit_#{resource.singular}" + get "(.:format)", :to => :show, :as => resource.member_name if resource.actions.include?(:show) + post "(.:format)", :to => :create if resource.actions.include?(:create) + put "(.:format)", :to => :update if resource.actions.include?(:update) + delete "(.:format)", :to => :destroy if resource.actions.include?(:destroy) + get "/new(.:format)", :to => :new, :as => "new_#{resource.singular}" if resource.actions.include?(:new) + get "/edit(.:format)", :to => :edit, :as => "edit_#{resource.singular}" if resource.actions.include?(:edit) end end @@ -422,22 +444,22 @@ module ActionDispatch yield if block_given? with_scope_level(:collection) do - get "(.:format)", :to => :index, :as => resource.collection_name - post "(.:format)", :to => :create + get "(.:format)", :to => :index, :as => resource.collection_name if resource.actions.include?(:index) + post "(.:format)", :to => :create if resource.actions.include?(:create) with_exclusive_name_prefix :new do - get "/new(.:format)", :to => :new, :as => resource.singular + get "/new(.:format)", :to => :new, :as => resource.singular if resource.actions.include?(:new) end end with_scope_level(:member) do scope("/:id") do - get "(.:format)", :to => :show, :as => resource.member_name - put "(.:format)", :to => :update - delete "(.:format)", :to => :destroy + get "(.:format)", :to => :show, :as => resource.member_name if resource.actions.include?(:show) + put "(.:format)", :to => :update if resource.actions.include?(:update) + delete "(.:format)", :to => :destroy if resource.actions.include?(:destroy) with_exclusive_name_prefix :edit do - get "/edit(.:format)", :to => :edit, :as => resource.singular + get "/edit(.:format)", :to => :edit, :as => resource.singular if resource.actions.include?(:edit) end end end diff --git a/actionpack/test/dispatch/routing_test.rb b/actionpack/test/dispatch/routing_test.rb index b0d4e34345..6a25deb40c 100644 --- a/actionpack/test/dispatch/routing_test.rb +++ b/actionpack/test/dispatch/routing_test.rb @@ -93,6 +93,8 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest end end + resources :posts, :only => [:index, :show] + match 'sprockets.js' => ::TestRoutingMapper::SprocketsApp match 'people/:id/update', :to => 'people#update', :as => :update_person @@ -421,6 +423,22 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest end end + def test_posts + with_test_routes do + get '/posts' + assert_equal 'posts#index', @response.body + assert_equal '/posts', posts_path + + get '/posts/1' + assert_equal 'posts#show', @response.body + assert_equal '/posts/1', post_path(:id => 1) + + assert_raise(ActionController::RoutingError) { post '/posts' } + assert_raise(ActionController::RoutingError) { put '/posts/1' } + assert_raise(ActionController::RoutingError) { delete '/posts/1' } + end + end + def test_sprockets with_test_routes do get '/sprockets.js' -- cgit v1.2.3