Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带句点的RSpec控制器示例参数_Ruby On Rails_Rspec - Fatal编程技术网

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是否在应用约束之前拦截了这一点?