rails路由和params与'。'在他们中

时间:2011-09-01 20:30:35

标签: ruby-on-rails routing rspec

我正在使用rails来保护对只需要向Web应用的某些用户提供服务的文件的访问权限。为此,我有一个控制器方法,它接受有关他们想要访问的文件的信息,检查他们的授权,然后如果他们被授权使用x-sendfile将它发送给他们。除了一个障碍之外,这个概念工作得很好:如果他们请求一个资源。在其中我的路由不知道处理它。在我的路线文件中,我有:

match 'atb_resources/:guid/:resource'  => 'atb_resources#show', :as => :get_atb_resource, :via => :get

然后如果我在我的规范中尝试这个:

get 'show', :guid => 'some_guid', :resource => 'blah.txt'

规范失败了:

Failure/Error: get 'show', :guid => @atb.guid, :resource => 'blah.txt'
 ActionController::RoutingError:
   No route matches {:guid=>"ABCDEFG5", :resource=>"blah.txt", :controller=>"atb_resources", :action=>"show"}

但这很好:

get 'show', :guid => 'some_guid', :resource => 'blahDOTtxt'

我假设问题出在我的路由上,但我真的不明白句号如何影响路由。有什么想法吗?

1 个答案:

答案 0 :(得分:9)

对于Rails 3,您可以将其添加到您的路线中:

:constraints => { :resource => /.*/ }

for Rails 2(AFAIK):

:requirements => { :resource => /.*/ }

Rails会尝试将.txt解释为格式说明符,而不是其中之一。