我正在编写一些控制器/请求规范,目前正在处理更新请求。相当直接,在许多其他情况下,这是完美的,但我似乎遇到了障碍。
在我的routes.rb文件中,我限制了控制器的操作,因此
resources :model, except: [:destroy, :edit, :new]
为了避免在用户请求show
时调用/new
操作的问题,我添加了约束,因此路径现在看起来像
resources :model, except: [:destroy, :edit, :new], constraints: { id: /\d/ }
这很好用,请求/new
导致404,但是我现在遇到了我的请求测试问题,因为RSpec似乎使所有参数都成为字符串。
在我的测试中,我正在做
resource = FactoryGirl.create(:model)
params = { id: resource.id, resource: { edited: true }}
put :update, params
但是这会导致错误
No route matches {:id=>"10", :resource=>{:edited=>true}, :controller=>"models", :action=>"update"}
如果这个错误是正确的,那么似乎尽管我将id param设置为存储在资源中的整数ID(即使我明确地将.to_i放在它上面),param也会作为字符串发送,并且因为我的约束而没有匹配路线。
有没有办法阻止这种行为?我的路由测试正在按预期工作,所以我很困惑为什么这会失败。
更新
有趣的是,如果我将测试从控制器规范转移到请求规范,这将不再失败并且正常工作。我很高兴为他们制作所有请求规格,但我仍然很好奇为什么会发生这种情况,或者我是否偶然发现了rSpec中的错误?
答案 0 :(得分:0)
你的正则表达式指定了一个数字id
,但你输入的是两位数的id。也许修复就像将正则表达式更改为/\d+/
一样简单。