提交 07710fd3 编写于 作者: M Mike Gunderloy 提交者: Joshua Peek

Fix requirements for additional member/collection routes [#2054 state:resolved]

Signed-off-by: NJoshua Peek <josh@joshpeek.com>
上级 ac384820
...@@ -630,7 +630,7 @@ def map_member_actions(map, resource) ...@@ -630,7 +630,7 @@ def map_member_actions(map, resource)
action_path = resource.options[:path_names][action] if resource.options[:path_names].is_a?(Hash) action_path = resource.options[:path_names][action] if resource.options[:path_names].is_a?(Hash)
action_path ||= Base.resources_path_names[action] || action action_path ||= Base.resources_path_names[action] || action
map_resource_routes(map, resource, action, "#{resource.member_path}#{resource.action_separator}#{action_path}", "#{action}_#{resource.shallow_name_prefix}#{resource.singular}", m) map_resource_routes(map, resource, action, "#{resource.member_path}#{resource.action_separator}#{action_path}", "#{action}_#{resource.shallow_name_prefix}#{resource.singular}", m, { :force_id => true })
end end
end end
end end
...@@ -641,9 +641,9 @@ def map_member_actions(map, resource) ...@@ -641,9 +641,9 @@ def map_member_actions(map, resource)
map_resource_routes(map, resource, :destroy, resource.member_path, route_path) map_resource_routes(map, resource, :destroy, resource.member_path, route_path)
end end
def map_resource_routes(map, resource, action, route_path, route_name = nil, method = nil) def map_resource_routes(map, resource, action, route_path, route_name = nil, method = nil, resource_options = {} )
if resource.has_action?(action) if resource.has_action?(action)
action_options = action_options_for(action, resource, method) action_options = action_options_for(action, resource, method, resource_options)
formatted_route_path = "#{route_path}.:format" formatted_route_path = "#{route_path}.:format"
if route_name && @set.named_routes[route_name.to_sym].nil? if route_name && @set.named_routes[route_name.to_sym].nil?
...@@ -660,9 +660,10 @@ def add_conditions_for(conditions, method) ...@@ -660,9 +660,10 @@ def add_conditions_for(conditions, method)
end end
end end
def action_options_for(action, resource, method = nil) def action_options_for(action, resource, method = nil, resource_options = {})
default_options = { :action => action.to_s } default_options = { :action => action.to_s }
require_id = !resource.kind_of?(SingletonResource) require_id = !resource.kind_of?(SingletonResource)
force_id = resource_options[:force_id] && !resource.kind_of?(SingletonResource)
case default_options[:action] case default_options[:action]
when "index", "new"; default_options.merge(add_conditions_for(resource.conditions, method || :get)).merge(resource.requirements) when "index", "new"; default_options.merge(add_conditions_for(resource.conditions, method || :get)).merge(resource.requirements)
...@@ -670,7 +671,7 @@ def action_options_for(action, resource, method = nil) ...@@ -670,7 +671,7 @@ def action_options_for(action, resource, method = nil)
when "show", "edit"; default_options.merge(add_conditions_for(resource.conditions, method || :get)).merge(resource.requirements(require_id)) when "show", "edit"; default_options.merge(add_conditions_for(resource.conditions, method || :get)).merge(resource.requirements(require_id))
when "update"; default_options.merge(add_conditions_for(resource.conditions, method || :put)).merge(resource.requirements(require_id)) when "update"; default_options.merge(add_conditions_for(resource.conditions, method || :put)).merge(resource.requirements(require_id))
when "destroy"; default_options.merge(add_conditions_for(resource.conditions, method || :delete)).merge(resource.requirements(require_id)) when "destroy"; default_options.merge(add_conditions_for(resource.conditions, method || :delete)).merge(resource.requirements(require_id))
else default_options.merge(add_conditions_for(resource.conditions, method)).merge(resource.requirements) else default_options.merge(add_conditions_for(resource.conditions, method)).merge(resource.requirements(force_id))
end end
end end
end end
......
...@@ -175,6 +175,24 @@ def test_with_collection_actions_and_name_prefix ...@@ -175,6 +175,24 @@ def test_with_collection_actions_and_name_prefix
end end
end end
def test_with_collection_actions_and_name_prefix_and_member_action_with_same_name
actions = { 'a' => :get }
with_restful_routing :messages, :path_prefix => '/threads/:thread_id', :name_prefix => "thread_", :collection => actions, :member => actions do
assert_restful_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options|
actions.each do |action, method|
assert_recognizes(options.merge(:action => action), :path => "/threads/1/messages/#{action}", :method => method)
end
end
assert_restful_named_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options|
actions.keys.each do |action|
assert_named_route "/threads/1/messages/#{action}", "#{action}_thread_messages_path", :action => action
end
end
end
end
def test_with_collection_action_and_name_prefix_and_formatted def test_with_collection_action_and_name_prefix_and_formatted
actions = { 'a' => :get, 'b' => :put, 'c' => :post, 'd' => :delete } actions = { 'a' => :get, 'b' => :put, 'c' => :post, 'd' => :delete }
...@@ -209,6 +227,14 @@ def test_with_member_action ...@@ -209,6 +227,14 @@ def test_with_member_action
end end
end end
def test_with_member_action_and_requirement
expected_options = {:controller => 'messages', :action => 'mark', :id => '1.1.1'}
with_restful_routing(:messages, :requirements => {:id => /[0-9]\.[0-9]\.[0-9]/}, :member => { :mark => :get }) do
assert_recognizes(expected_options, :path => 'messages/1.1.1/mark', :method => :get)
end
end
def test_member_when_override_paths_for_default_restful_actions_with def test_member_when_override_paths_for_default_restful_actions_with
[:put, :post].each do |method| [:put, :post].each do |method|
with_restful_routing :messages, :member => { :mark => method }, :path_names => {:new => 'nuevo'} do with_restful_routing :messages, :member => { :mark => method }, :path_names => {:new => 'nuevo'} do
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册