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 63 63 @requirements ||= @options[:requirements] || {} 64 64 @id_requirement ||= { :id => @requirements.delete(:id) || /[^#{Routing::SEPARATORS.join}]+/ } 65 65 66 with_id? @requirements.merge(@id_requirement) : @requirements66 (with_id && !self.kind_of?(SingletonResource)) ? @requirements.merge(@id_requirement) : @requirements 67 67 end 68 68 69 69 def path … … 444 444 def map_member_actions(map, resource) 445 445 resource.member_methods.each do |method, actions| 446 446 actions.each do |action| 447 action_options = action_options_for(action, resource, method )447 action_options = action_options_for(action, resource, method, true) 448 448 map.named_route("#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}", action_options) 449 449 map.named_route("formatted_#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}.:format",action_options) 450 450 end 451 451 end 452 452 453 show_action_options = action_options_for("show", resource )453 show_action_options = action_options_for("show", resource, nil, true) 454 454 map.named_route("#{resource.name_prefix}#{resource.singular}", resource.member_path, show_action_options) 455 455 map.named_route("formatted_#{resource.name_prefix}#{resource.singular}", "#{resource.member_path}.:format", show_action_options) 456 456 457 update_action_options = action_options_for("update", resource )457 update_action_options = action_options_for("update", resource, nil, true) 458 458 map.connect(resource.member_path, update_action_options) 459 459 map.connect("#{resource.member_path}.:format", update_action_options) 460 460 461 destroy_action_options = action_options_for("destroy", resource )461 destroy_action_options = action_options_for("destroy", resource, nil, true) 462 462 map.connect(resource.member_path, destroy_action_options) 463 463 map.connect("#{resource.member_path}.:format", destroy_action_options) 464 464 end … … 467 467 { :conditions => method == :any ? {} : { :method => method } } 468 468 end 469 469 470 def action_options_for(action, resource, method = nil )470 def action_options_for(action, resource, method = nil, require_id = false) 471 471 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 480 478 end 479 480 default_options.merge(conditions_for(method)).merge(resource.requirements(require_id)) 481 481 end 482 482 end 483 483 end -
actionpack/test/controller/resources_test.rb
old new 81 81 end 82 82 end 83 83 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 84 92 def test_with_path_prefix_requirements 85 93 expected_options = {:controller => 'messages', :action => 'show', :thread_id => '1.1.1', :id => '1'} 86 94 with_restful_routing :messages, :path_prefix => '/thread/:thread_id', :requirements => {:thread_id => /[0-9]\.[0-9]\.[0-9]/} do