2015-10-07 3 views
0

J'essaie de faire quelques tests de base de mon application.Aucune route ne correspond {: action => "créer",: controller => "transactions"}

J'ai un controller transactions_controller.rb avec une méthode 'create' là. Voici mes itinéraires:

root GET/      home#index 
     PUT /transaction/:id(.:format) transactions#create 
     GET /transaction/:id(.:format) transactions#show 
     GET /types/:type(.:format)  transactions#types 
     GET /sum/:id(.:format)   transactions#sum 

Voici le code à l'intérieur transactions_controller_test.rb méthode d'essai:

test "should create new transaction" do 
    put :create, { amount: 7000, type: "cars", parent_id: 2 } 
    assert_response(:success, message = '{ "status": "ok" }') 
    end 

Et il produit l'erreur suivante si je lance test rake:

ActionController::UrlGenerationError: No route matches {:action=>"create", :controller=>"transactions"} 

Pourquoi si tout est en place? Quelqu'un pourrait-il m'aider?

+1

Pouvez-vous mettre à jour la question avec le code 'routes.rb'? – Pavan

Répondre

0

Erreur dans routes.rb

PUT /transaction/:id(.:format) transactions#create 

doit-elle être

POST /transactions(.:format) transactions#create 

Votre itinéraire est tracé pour les transactions # mise à jour (PUT demande avec id param). Il devrait ressembler à:

resources :transactions, only: [:show, :create] 
+0

Vous ne devez pas utiliser PUT pour créer une ressource. C'est le 5ème commandement :) – max

+0

Typo. POST pour créer, bien sûr. –

1

Vous devez utiliser POST not PUT to create a resource. Dans Rails et REST en général, l'action PATCH ou PUT est utilisée pour mettre à jour une ressource existante. PUT a généralement été déprécié dans les versions ultérieures de Rails si la faveur de PATCH était due à la sémantique des définitions de verbes HTTP. En bref, utilisez PATCH et non PUT.

Changer la définition de votre route vers:

resources :transactions, only: [:show, :create, :update] 

Cela va changer vos itinéraires à:

GET /transactions, transactions#index 
POST /transactions, transactions#create 
PATCH /transactions/:id, transactions#update 

Et votre changement de votre test pour utiliser le verbe HTTP correct:

test "should create new transaction" do 
    post :create, { amount: 7000, type: "cars", parent_id: 2 } 
    assert_response(:success, message = '{ "status": "ok" }') 
end 

En outre, vous devriez envisager un modèle plus reposant pour vos routes supplémentaires:

resources :transactions, only: [:show, :create] do 
    collection do 
    get :sum # /transactions/sum or the sum of all transactions. 
    end 
end 

Il est un peu difficile de ce /type fait, mais si elle montre des transactions par type vous pouvez utiliser un param de requête avec l'action index à la place:

# GET /transactions?type=car 
def index 
    @transactions = Transaction.all 
    @transactions = @transactions.where(type: params[:type]) if params[:type] 
end 

De plus, vous pouvez suivre les rails conventions pour les paramètres:

post :create, { transaction: { amount: 7000, type: "cars", parent_id: 2 } } 

Cette imbrication peut sembler idiot au début, mais il vous permet d'utiliser les Rails form helpers et solides paramètres correctement.

-1

Dans la route, lorsque vous dites 'PUT/transaction /: id (.: Format) transactions # créer », cela signifie que votre besoin envoyer attr id, puis dans votre test besoin

put: créer, {montant: 7000, tapez: "voitures", id: 2}

ou , supprime l'identifiant params de la route