2015-08-31 7 views
10

Bulduğum her benzer soruyu okudum ve hala sorunumu çözemiyor.ActionController :: UrlGenerationError, Rota eşleşmiyor

# routes.rb 
Rails.application.routes.draw do 
    resources :lists, only: [:index, :show, :create, :update, :destroy] do 
    resources :items, except: [:new] 
    end 
end 
# items_controller.rb (excerpt) 
class ItemsController < ApplicationController 
    ... 

    def create 
    @list = List.find(params[:list_id]) 
    ... 
    end 
    ... 
end 

# items_controller_spec.rb (excerpt) 
RSpec.describe ItemsController, type: :controller do 
    ... 

    let!(:list) { List.create(title: "New List title") } 

    let(:valid_item_attributes) { 
    { title: "Some Item Title", complete: false, list_id: list.id } 
    } 

    let!(:item) { list.items.create(valid_item_attributes) } 
    describe "POST #create" do 
    context "with valid params" do 
     it "creates a new item" do 
     expect { 
      post :create, { item: valid_item_attributes, format: :json } 
     }.to change(Item, :count).by(1) 
     end 
    end 
    end 
    ... 
end 


ve RSpec hatası:

1) ItemsController POST #create with valid params creates a new item 
    Failure/Error: post :create, { item: valid_item_attributes, format: :json } 
    ActionController::UrlGenerationError: 
     No route matches {:action=>"create", :controller=>"items", :format=>:json, :item=>{:title=>"Some Item Title", :complete=>false, :list_id=>1}} 

rake routes çıktı:

list_items  GET /lists/:list_id/items(.:format)   items#index 
       POST /lists/:list_id/items(.:format)   items#create 
edit_list_item GET /lists/:list_id/items/:id/edit(.:format) items#edit 
    list_item GET /lists/:list_id/items/:id(.:format)  items#show 
       PATCH /lists/:list_id/items/:id(.:format)  items#update 
       PUT /lists/:list_id/items/:id(.:format)  items#update 
       DELETE /lists/:list_id/items/:id(.:format)  items#destroy 

curl aracılığıyla varolan listedeki yeni bir öğeyi başarıyla oluşturabilirim, bu da rotanın tamam olduğunu, testimde yanlış bir şey yapmam gerektiğini söyler.

curl -i -X POST -H "Content-Type:application/json" -H "X-User-Email:[email protected]" -H "X-Auth-xxx" -d '{ "item": { "title": "new item", "complete": "false"} }' http://localhost:3000/lists/5/items 

Gerçekten kafam karıştı. Rotalarım doğru şekilde kuruldu. ItemsController#create yöntemi kesinlikle var. Testlerin geri kalanı items_controller_spec.rb numaranızda sorun yaşamadan geçer.

Belirgin bir şey mi eksik?

+0

Öğütme yolları öğelerinizle ilgili ne söyler? –

+0

Çıktıyı "rake rotaları" dan (yukarıda) eklendi. – RobertJoseph

cevap

12

Testlerimde yapmam gereken düzeltmeler (items_controller_spec.rb). Doğru kareyi post create:'a aktarmıyordum.

describe "POST #create" do 
    context "with valid params" do 
     it "creates a new item" do 
     expect { 
      post :create, { list_id: list.id, item: valid_item_attributes, format: :json } 
     }.to change(Item, :count).by(1) 
     end 

     it "assigns a newly created item as @item" do 
     post :create, { list_id: list.id, item: valid_item_attributes, format: :json } 

     expect(assigns(:item)).to be_a(Item) 
     expect(assigns(:item)).to be_persisted 
     end 
    end # "with valid params" 

    context "with invalid params" do 
     it "assigns a newly created but unsaved item as @item" do 
     post :create, { list_id: list.id, item: invalid_item_attributes, format: :json } 

     expect(assigns(:item)).to be_a_new(Item) 
     end 

     it "returns unprocessable_entity status" do 
     put :create, { list_id: list.id, item: invalid_item_attributes, format: :json } 

     expect(response.status).to eq(422) 
     end 
    end # "with invalid params" 
    end # "POST #create" 
+0

'ItemsController '' Listeler :: ItemsController' olarak adlandırılır ve 'lists' klasörünün içinde yaşar mı? Görünüşe göre Rails yapı sözleşmesini takip etmiyorsun. Ben de aynı sorunları yaşıyorum. – Sebastialonso

+0

Denetleyici dosyasının fiziksel konumunun orijinal sorunumla ilgisi yoktu. – RobertJoseph