2012-10-05 80 views
2

在我的控制器的規格,RSpec的控制器例如PARAM當我執行這一行:與週期

post :register_pass, :device_id => 'DEV1C3', :pass_type_id => 'pass.com.example.GSPassType', :serial_no => '5ER14L' 

我得到一個ActionController::RoutingError

Failure/Error: post :register_pass, :device_id => 'DEV1C3', :pass_type_id => 'pass.com.example.GSPassType', :serial_no => '5ER14L' 
    ActionController::RoutingError: 
    No route matches {:action=>"register_pass", :controller=>"purchases/passbook/registrations", :pass_type_id=>"pass.com.example.GSPassType", :serial_no=>"5ER14L", :device_id=>"DEV1C3"} 

即使rake routes | grep register_pass返回

register_pass POST /v1/devices/:device_id/registrations/:pass_type_id/:serial_no(.:format)  {:action=>"register_pass", :controller=>"purchases/passbook/registrations"} 

但是,當我刪除:pass_type_id值中的期間時,post上面列出的行執行並且路由被識別(我使用rspec驗證了它,甚至直接捲曲它,在預期的控制器操作中放置斷點,路由起作用)。

我試着用Rack::Utils.escape上的週期值,但也失敗了。我也嘗試手動將週期更改爲它們的URL編碼值,但Rails似乎沒有在params散列中解碼它們。

爲什麼在這種情況下不能使用期間?

我怎樣才能在經過時間的值(無控制器使用String#gsub手動解碼它

回答

2

有你遇到兩個問題:1)的期間爲在URL中有效的字符序列,所以它不會被Rack::Utils.escapeURI.escape替代,2)Rails將句點作爲路徑分隔符來在URL末尾啓用格式解析,例如.json,.xml等(如ActionController::Routing::SEPARATORS中定義)。

對於這個用例,我建議在此路由中添加約束條件,允許您允許任何字符爲:post_id。我沒有看到你的路由文件是什麼樣子,但它可能是這樣與變化:

post "/v1/devices/:device_id/registrations/:pass_type_id/:serial_no(.:format)" => 
    "purchases/passbook/registrations#register_pass", 
    :constraints => { :pass_type_id => /.*/ } 

很多其他途徑偉大的信息在Rails guide on routing

+0

我添加了添加此約束約束我的routes.rb文件,但這似乎沒有幫助,是軌道攔截的一部分應用約束之前? – tlehman

+0

你必須告訴我你是如何添加約束的。 – rossta

+0

這是一個錯字,你是絕對正確的。 – tlehman