Ruby on rails 带句点的RSpec控制器示例参数
在我的控制器规范中,当我执行该行时:Ruby on rails 带句点的RSpec控制器示例参数,ruby-on-rails,rspec,Ruby On Rails,Rspec,在我的控制器规范中,当我执行该行时: 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', :
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
手动解码?您会遇到两个问题:1)句点是URL序列中的有效字符,因此它不会被Rack::Utils.escape
或URI.escape
,2)Rails将句点视为路径分隔符,以启用URL末尾的格式解析,例如.json、.xml等(定义见ActionController::Routing::SEPARATORS
)
对于这个用例,我建议向这个路由添加约束,允许您允许:post\u id
的任何字符。我看不出您的路由文件是什么样子,但更改后可能是这样的:
post "/v1/devices/:device_id/registrations/:pass_type_id/:serial_no(.:format)" =>
"purchases/passbook/registrations#register_pass",
:constraints => { :pass_type_id => /.*/ }
关于在中添加此约束的其他方法的大量有用信息我将约束添加到我的routes.rb文件中,但这似乎没有帮助,rails是否在应用约束之前拦截了这一点?