Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #7633: pass_resource_id_requirements_to_member_actions.diff

File pass_resource_id_requirements_to_member_actions.diff, 4.7 kB (added by quixoten, 2 years ago)
  • actionpack/lib/action_controller/resources.rb

    old new  
    6363        @requirements   ||= @options[:requirements] || {} 
    6464        @id_requirement ||= { :id => @requirements.delete(:id) || /[^#{Routing::SEPARATORS.join}]+/ } 
    6565         
    66         with_id ? @requirements.merge(@id_requirement) : @requirements 
     66        (with_id && !self.kind_of?(SingletonResource)) ? @requirements.merge(@id_requirement) : @requirements 
    6767      end 
    6868       
    6969      def path 
     
    444444      def map_member_actions(map, resource) 
    445445        resource.member_methods.each do |method, actions| 
    446446          actions.each do |action| 
    447             action_options = action_options_for(action, resource, method
     447            action_options = action_options_for(action, resource, method, true
    448448            map.named_route("#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}", action_options) 
    449449            map.named_route("formatted_#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}.:format",action_options) 
    450450          end 
    451451        end 
    452452 
    453         show_action_options = action_options_for("show", resource
     453        show_action_options = action_options_for("show", resource, nil, true
    454454        map.named_route("#{resource.name_prefix}#{resource.singular}", resource.member_path, show_action_options) 
    455455        map.named_route("formatted_#{resource.name_prefix}#{resource.singular}", "#{resource.member_path}.:format", show_action_options) 
    456456 
    457         update_action_options = action_options_for("update", resource
     457        update_action_options = action_options_for("update", resource, nil, true
    458458        map.connect(resource.member_path, update_action_options) 
    459459        map.connect("#{resource.member_path}.:format", update_action_options) 
    460460 
    461         destroy_action_options = action_options_for("destroy", resource
     461        destroy_action_options = action_options_for("destroy", resource, nil, true
    462462        map.connect(resource.member_path, destroy_action_options) 
    463463        map.connect("#{resource.member_path}.:format", destroy_action_options) 
    464464      end 
     
    467467        { :conditions => method == :any ? {} : { :method => method } } 
    468468      end 
    469469 
    470       def action_options_for(action, resource, method = nil
     470      def action_options_for(action, resource, method = nil, require_id = false
    471471        default_options = { :action => action.to_s } 
    472         require_id = !resource.kind_of?(SingletonResource) 
    473         case default_options[:action] 
    474           when "index", "new" : default_options.merge(conditions_for(method || :get)).merge(resource.requirements) 
    475           when "create"       : default_options.merge(conditions_for(method || :post)).merge(resource.requirements) 
    476           when "show", "edit" : default_options.merge(conditions_for(method || :get)).merge(resource.requirements(require_id)) 
    477           when "update"       : default_options.merge(conditions_for(method || :put)).merge(resource.requirements(require_id)) 
    478           when "destroy"      : default_options.merge(conditions_for(method || :delete)).merge(resource.requirements(require_id)) 
    479           else                  default_options.merge(conditions_for(method)).merge(resource.requirements) 
     472         
     473        method ||= case default_options[:action] 
     474          when "index", "new", "show", "edit" : :get 
     475          when "create"       : :post 
     476          when "update"       : :put 
     477          when "destroy"      : :delete 
    480478        end 
     479         
     480        default_options.merge(conditions_for(method)).merge(resource.requirements(require_id)) 
    481481      end 
    482482  end 
    483483end 
  • actionpack/test/controller/resources_test.rb

    old new  
    8181    end 
    8282  end 
    8383   
     84  def test_irregular_id_requirements_should_get_passed_to_member_actions 
     85    expected_options = {:controller => 'messages', :action => 'custom', :id => '1.1.1'} 
     86     
     87    with_restful_routing(:messages, :member => {:custom => :get}, :requirements => {:id => /[0-9]\.[0-9]\.[0-9]/}) do 
     88      assert_recognizes(expected_options, :path => 'messages/1.1.1/custom', :method => :get) 
     89    end 
     90  end 
     91   
    8492  def test_with_path_prefix_requirements 
    8593    expected_options = {:controller => 'messages', :action => 'show', :thread_id => '1.1.1', :id => '1'} 
    8694    with_restful_routing :messages, :path_prefix => '/thread/:thread_id', :requirements => {:thread_id => /[0-9]\.[0-9]\.[0-9]/} do