2016-11-13 7 views
1

Ich habe eine Rails-API-Anwendung, wo ich Devise Juwel für Benutzerverwaltung verwenden. Ich habe ein Benutzermodell aus dem Devise-Juwel erstellt. Danach bemerkte ich, dass ich zwei gleiche Routen im rake routes Befehl aufgeführt habe. Ich möchte POST (/users) anrufen api/v1/users#create Aktion zuerst und dann devise/registrations#create anrufen.Rails gleiche Route (POST/Benutzer) für verschiedene Controller-Aktionen [Devise]

user_registration POST /users(.:format)  devise/registrations#create 
api_users POST   /users(.:format)  api/v1/users#create {:format=>:json} 

Wenn ich testen POST (/users) users_controller_spec Datei verwenden, wird api/v1/users#create Aktion aufgerufen. Wenn ich jedoch eine POST (/users) mit POSTMAN, die Protokolle zeigen, dass devise/registrations#create Aktion stattdessen aufgerufen wird.

Wie korrigiere ich dies, so dass die POST (/users) ich POSTMAN oder curl Anrufe api/v1/users#create zuerst zum Erstellen des Benutzermodells und dann Anrufe devise/registrations#create, um den Benutzer zu registrieren?

Ich bin nicht 100% sicher, wie das Gerät funktioniert, also wäre jede Hilfe hier hilfreich.

Das ist mein config/routes.rb

Rails.application.routes.draw do 
    devise_for :users 
    # Api definition 
    namespace :api, defaults: { format: :json }, path: '/' do 
    scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do 
     # We are going to list our resources here 
     resources :users, only: [:show, :create, :update, :destroy] 
     resources :sessions, only: [:create, :destroy] 
    end 
    end 
end 
+0

bitte Sie posten Sie Ihre ** 'config/routes.rb' ** Datei? –

+0

Ihre Rails-Version bitte, wollen auch nur wissen, welche Art von Anfrage Sie auf diese Methoden treffen, zB json, html etc, bitte posten Sie Ihre Routen-Datei auch @millin –

+0

Ich mache json Anfrage, weil ich eine API erstellen kann @ ManojMenon –

Antwort

1

die Sache mit Rails Routes So wird, wenn Sie eine Anfrage machen, Routen geprüft werden, wie sie in den routes.rb von oben nach unten definiert sind.

Nun, wenn Sie eine Anfrage über POSTMAN machen, der /users Pfad übereinstimmt mit einem Pfad über devise_for erzeugt wird, wie es die erste Zeile in der Datei ist.

Wenn Sie nun Tests für den Controller schreiben, Sie sind nicht wirklich /users zugreifen, werden Sie nur die api/v1/users_controller erzählt die create Methode aufzurufen, die die api/v1/users#create

Jetzt treffen gebunden ist, Ihnen einen Weg, kann diesen Konflikt lösen, indem man ändert, was devise seine Routen nennt. Wenn Sie so etwas tun:

Rails.application.routes.draw do 
    devise_for :users, path: 'customer' 
    # Api definition 
    namespace :api, defaults: { format: :json }, path: '/' do 
    scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do 
     # We are going to list our resources here 
     resources :users, only: [:show, :create, :update, :destroy] 
     resources :sessions, only: [:create, :destroy] 
    end 
    end 
end 

Dies ist, was die devise Routen werden:

 new_user_session GET /customer/sign_in(.:format)  devise/sessions#new 
     user_session POST /customer/sign_in(.:format)  devise/sessions#create 
destroy_user_session DELETE /customer/sign_out(.:format)  devise/sessions#destroy 
     user_password POST /customer/password(.:format)  devise/passwords#create 
    new_user_password GET /customer/password/new(.:format) devise/passwords#new 
    edit_user_password GET /customer/password/edit(.:format) devise/passwords#edit 
... 
Verwandte Themen