【问题标题】:Rails nested controller - error: No route matchesRails 嵌套控制器 - 错误:没有路由匹配
【发布时间】:2018-10-31 13:49:35
【问题描述】:

导轨 5.2.1 RSpec 3.8

我正在尝试使用嵌套控制器构建 REST API。我收到一个错误:

No route matches {:action=>"index", :controller=>"playlists/playlist_items", :format=>:json, :playlist=>60}

这是我的路线.rb:

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  resources :playlists do
    resources :playlist_items, controller: 'playlists/playlist_items'
  end
  resources :playlist_items
  resources :artists
  resources :tracks
end

这是rake routes的输出:

                   Prefix Verb   URI Pattern                                                                              Controller#Action
  playlist_playlist_items GET    /playlists/:playlist_id/playlist_items(.:format)                                         playlists/playlist_items#index
                          POST   /playlists/:playlist_id/playlist_items(.:format)                                         playlists/playlist_items#create
   playlist_playlist_item GET    /playlists/:playlist_id/playlist_items/:id(.:format)                                     playlists/playlist_items#show
                          PATCH  /playlists/:playlist_id/playlist_items/:id(.:format)                                     playlists/playlist_items#update
                          PUT    /playlists/:playlist_id/playlist_items/:id(.:format)                                     playlists/playlist_items#update
                          DELETE /playlists/:playlist_id/playlist_items/:id(.:format)                                     playlists/playlist_items#destroy
... etc ...

这是失败的测试:

describe Playlists::PlaylistItemsController do
  describe "GET #index" do
    before do
      @playlist =  create :playlist, { date: '2000-01-01' } 
      get :index, params: { playlist: @playlist.id, format: :json }
    end
    it "returns http success" do
      expect(response).to have_http_status(:success)
    end
  end
end

错误提示没有路由匹配

{:action=>"index", :controller=>"playlists/playlist_items", :format=>:json, :playlist=>60}

但据我所知,rake routes 中的这一行完全匹配:

  playlist_playlist_items GET    /playlists/:playlist_id/playlist_items(.:format)                                         playlists/playlist_items#index

我错过了什么?

【问题讨论】:

    标签: ruby-on-rails routes rspec-rails


    【解决方案1】:

    该参数称为playlist_id 而不是playlist

    describe Playlists::PlaylistItemsController do
      describe "GET #index" do
        before do
          @playlist =  create :playlist, { date: '2000-01-01' } 
          get :index, params: { playlist_id: @playlist.id, format: :json }
        end
        it "returns http success" do
          expect(response).to have_http_status(:success)
        end
      end
    end
    

    请注意,控制器应返回 401 CREATED 响应。

    您还可以通过添加module 选项将资源嵌套在模块中:

    resources :playlists do
      resources :playlist_items, module: :playlists
    end
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多