2015-08-31 8 views
10

Ho letto tutte le domande simili che ho trovato e ancora non riesco a capire il mio problema.ActionController :: UrlGenerationError, Nessuna corrispondenza corrisponde a

# 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 

E l'errore RSpec:

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}} 

L'uscita dal rake routes:

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 

Posso creare correttamente un nuovo elemento in un elenco esistente tramite curl che mi dice che il percorso è ok, devo fare qualcosa di sbagliato nel mio test.

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 

Sono davvero confuso. I miei percorsi sono impostati correttamente. Un metodo ItemsController#create esiste sicuramente. Il resto dei test in items_controller_spec.rb passa senza problemi.

Mi manca qualcosa di ovvio?

+0

Che cosa dice "percorsi di rastrellamento" sui percorsi degli articoli? –

+0

Aggiunto l'output da 'rake routes' (sopra). – RobertJoseph

risposta

12

Ecco le correzioni che ho dovuto apportare ai miei test (items_controller_spec.rb). Non stavo passando l'hash corretto a post create:.

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

Shoudn't tuo 'ItemsController' si chiama' Lists :: ItemsController', e vive all'interno di una cartella 'lists'? Sembra che tu non stia seguendo la convenzione della struttura Rails. Lo sono, e sto avendo gli stessi problemi. – Sebastialonso

+0

L'ubicazione fisica del file del controller non ha avuto nulla a che fare con il mio problema originale. – RobertJoseph