【问题标题】:RSpec "No routes matches"RSpec“没有路线匹配”
【发布时间】:2023-03-12 14:17:01
【问题描述】:

我正在尝试为我的一个控制器上的自定义操作编写请求规范。

我的 routes.rb 是这样的:

resources :cars do
  member do
    get :search
  end
end

我的 cars_controller.rb 是这样的:

class CarsController < ApplicationController
  def search
    # pending 
  end
end

我的 controller_cars_spec.rb 是这样的:

describe CarsController do
  describe 'Search' do
    it 'should call the model method that perform search by brand' do
      get :search
    end  
  end
end

rake 路线说:

search_car GET    /cars/:id/search(.:format) {:action=>"search", :controller=>"cars"}

然后自动测试说:

Failures:
1) CarsController Search should call the model method that perform search by brand
   Failure/Error: get :search
   ActionController::RoutingError:
     No route matches {:controller=>"cars", :action=>"search"}
   # ./spec/controllers/cars_controller_spec.rb:19:in `block (3 levels) in <top (required)>'

有什么问题?我无法解决这个失败...

【问题讨论】:

  • 对不起... cars_controllers.rb 和 cars_controllers_spec.rb。这是一个转录错误,但问题是一样的。

标签: rest rspec routes


【解决方案1】:

您需要将 :id 参数传递给您的规范文件中的路由,如本文所示: "No route matches" error?

get :search, :id => @car.id

【讨论】:

    【解决方案2】:

    简而言之,这应该可以满足您的要求:

    get :search, :car_id => @car.id
    

    当您使用资源时,您需要为每个参数匹配路由,但这还不是全部。比如:

    get :search, :id => @car.id
    

    似乎可以,但没有。

    在使用资源助手时,ID 是通过为任何子路由和资源的资源名称添加前缀来命名的。我不完全确定为什么 rspec 错误不会抱怨缺少:car_id,也许其他人可以填补知识的缺失部分。

    【讨论】:

      【解决方案3】:

      member 用于单个资源,因此它需要一个 :id。你想要:

      resources :cars do
        collection do
          get :search
        end
      end
      

      【讨论】:

      • “应该调用执行按品牌搜索的模型方法”这句话表示我搜索了多个 ONE 品牌的汽车......对不起我的英语不好
      • 我可能仍然完全误解了你想要做什么,如果我弄混了水,很抱歉。您已将自定义控制器操作设置为“成员”而不是“集合”,我认为这对于您要完成的工作是不正确的。定义为成员操作的路线将需要汽车 ID,而这正是您在测试中看到的错误。如果您想搜索的不是特定的汽车,而是一般的汽车搜索,您需要在集合块中定义操作,如图所示。你试过了吗?
      【解决方案4】:

      检查是否

      resources :cars
      

      在

      之前
      match '/cars/:id/search' => 'cars#search'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 2019-05-25
        • 2017-04-02
        • 2018-03-04
        相关资源
        最近更新 更多