Rails[RSpec]: put :update, 没有路由匹配 :id => nil

Rails[RSpec]: put :update, no route matches :id => nil

非常奇怪的错误。我正在为 subgroup 控制器编写 RSpec 测试,它与 group 处于多对一关系。 group 接受 subgroup 的嵌套属性。我使用了脚手架,并且使用了提供的测试(编辑测试)。在我开始测试 Devise 之前,这些测试都有效。现在,我使用无效参数进行更新的测试失败了。

测试在 subgroups_controller_spec.rb

let(:invalid_attributes) {
  {name: nil, group_id: nil}
}

context "with invalid params" do
  it "assigns the subgroup as @subgroup" do
    subgroup = Subgroup.create! valid_attributes
    puts "param: #{subgroup.to_param}, id: #{subgroup.id}
    put :update, {:id => subgroup.to_param, :subgroup => invalid_attributes}, valid_session
    expect(assigns(:subgroup)).to eq(subgroup)
  end

  it "re-renders the 'edit' template" do
    subgroup = Subgroup.create! valid_attributes
    put :update, {:id => subgroup.to_param, :subgroup => invalid_attributes}, valid_session
    expect(response).to render_template("edit")
  end
end

错误信息:

1) SubgroupsController PUT #update with invalid params assigns the subgroup as @subgroup
     Failure/Error: put :update, {:id => subgroup.to_param, :subgroup => invalid_attributes}, valid_session
     ActionView::Template::Error:
       No route matches {:action=>"show", :controller=>"groups", :id=>nil, :locale=>nil}

但是 puts "param: #{subgroup.to_param}, id: #{subgroup.id}" 打印 param: 1, id: 1 很明显这些 id 不为零。

rake 路线:

    subgroups GET      (/:locale)/subgroups(.:format)           subgroups#index 
              POST     (/:locale)/subgroups(.:format)           subgroups#create 
 new_subgroup GET      (/:locale)/subgroups/new(.:format)       subgroups#new 
edit_subgroup GET      (/:locale)/subgroups/:id/edit(.:format)  subgroups#edit
     subgroup GET      (/:locale)/subgroups/:id(.:format)       subgroups#show
              PATCH    (/:locale)/subgroups/:id(.:format)       subgroups#update
              PUT      (/:locale)/subgroups/:id(.:format)       subgroups#update
              DELETE   (/:locale)/subgroups/:id(.:format)       subgroups#destroy

p.s。路线中列出了语言环境,但我删除了它们以便于查看。我不认为语言环境是这个问题,因为更新需要一个 :id 来更新。

问题不在于您的 put 路线,而在于它正在做的渲染。您收到模板错误,错误详情显示您正尝试在 groups 上执行 show。检查布局中使用的路径。