2013-08-15 5 views
7

Mam zainstalowaną aplikację dla mojej szyny i narzędzie Devise do używania interfejsu API JSON do rejestracji użytkownika i logowania. Efektem ubocznym jest to, że edit_password_url w wiadomości resetowania hasła zostanie przypadkowo wysyłanie użytkownikom:Wymyślanie: edit_password_url w e-mailu służącym do resetowania hasła wysyła użytkowników pod adres url/api/v1/

http://localhost:3000/api/v1/password/edit?reset_password_token=ZzyPCgmspN2964ENUkSS 

kiedy nie powinien mieć api/v1/ i powinien wysłać je na adres:

http://localhost:3000/password/edit?reset_password_token=ZzyPCgmspN2964ENUkSS 

Szukałem , ale nie może dowiedzieć się, gdzie to naprawić.

Utworzyłem następujące:

Api::V1::SessionsController < Devise::SessionsController 

i

Api::V1::RegistrationsController < RegistrationsController 

mam regularny RegistrationsController która dziedziczy z opracowania, ale nie jest to regularne SessionsController, więc po prostu odziedziczyć prosto z devise tam .

Dzięki za pomoc!

EDIT:

routes.rb

namespace :api, defaults: {format: 'json'} do 
    namespace :v1 do 
     resources :users 
     devise_for :users, :path => '', path_names: {sign_in: "login", sign_out: "logout"}, 
             controllers: { omniauth_callbacks: "authentications", registrations: "registrations"} 
    end 
    end 

devise_for :users, :path => '', path_names: {sign_in: "login", sign_out: "logout"}, 
            controllers: { omniauth_callbacks: "authentications", registrations: "registrations"} 

    resources :users 

EDIT 2: rake routes wyjście

 new_api_v1_user_session GET  /api/v1/login(.:format)         api/v1/sessions#new {:format=>"json"} 
      api_v1_user_session POST  /api/v1/login(.:format)         api/v1/sessions#create {:format=>"json"} 
    destroy_api_v1_user_session DELETE /api/v1/logout(.:format)         api/v1/sessions#destroy {:format=>"json"} 
api_v1_user_omniauth_authorize GET|POST /auth/:provider(.:format)         authentications#passthru {:provider=>/twitter|facebook/, :format=>"json"} 
    api_v1_user_omniauth_callback GET|POST /auth/:action/callback(.:format)       authentications#(?-mix:twitter|facebook) {:format=>"json"} 
      api_v1_user_password POST  /api/v1/password(.:format)         api/v1/passwords#create {:format=>"json"} 
     new_api_v1_user_password GET  /api/v1/password/new(.:format)        api/v1/passwords#new {:format=>"json"} 
     edit_api_v1_user_password GET  /api/v1/password/edit(.:format)       api/v1/passwords#edit {:format=>"json"} 
           PUT  /api/v1/password(.:format)         api/v1/passwords#update {:format=>"json"} 
cancel_api_v1_user_registration GET  /api/v1/cancel(.:format)         registrations#cancel {:format=>"json"} 
     api_v1_user_registration POST  /api/v1(.:format)           registrations#create {:format=>"json"} 
    new_api_v1_user_registration GET  /api/v1/sign_up(.:format)         registrations#new {:format=>"json"} 
    edit_api_v1_user_registration GET  /api/v1/edit(.:format)          registrations#edit {:format=>"json"} 
           PUT  /api/v1(.:format)           registrations#update {:format=>"json"} 
           DELETE /api/v1(.:format)           registrations#destroy {:format=>"json"} 
         sessions GET  /sessions(.:format)          sessions#index 
           POST  /sessions(.:format)          sessions#create 
        new_session GET  /sessions/new(.:format)         sessions#new 
        edit_session GET  /sessions/:id/edit(.:format)        sessions#edit 
         session GET  /sessions/:id(.:format)         sessions#show 
           PUT  /sessions/:id(.:format)         sessions#update 
           DELETE /sessions/:id(.:format)         sessions#destroy 
       authentications GET  /authentications(.:format)         authentications#index 
           POST  /authentications(.:format)         authentications#create 
      new_authentication GET  /authentications/new(.:format)        authentications#new 
      edit_authentication GET  /authentications/:id/edit(.:format)      authentications#edit 
       authentication GET  /authentications/:id(.:format)        authentications#show 
           PUT  /authentications/:id(.:format)        authentications#update 
           DELETE /authentications/:id(.:format)        authentications#destroy 

       new_user_session GET  /login(.:format)           devise/sessions#new 
        user_session POST  /login(.:format)           devise/sessions#create 
      destroy_user_session DELETE /logout(.:format)           devise/sessions#destroy 
     user_omniauth_authorize GET|POST /auth/:provider(.:format)         authentications#passthru {:provider=>/twitter|facebook/} 
     user_omniauth_callback GET|POST /auth/:action/callback(.:format)       authentications#(?-mix:twitter|facebook) 
        user_password POST  /password(.:format)          devise/passwords#create 
       new_user_password GET  /password/new(.:format)         devise/passwords#new 
      edit_user_password GET  /password/edit(.:format)         devise/passwords#edit 
           PUT  /password(.:format)          devise/passwords#update 
     cancel_user_registration GET  /cancel(.:format)           registrations#cancel 
       user_registration POST /              registrations#create 
      new_user_registration GET  /sign_up(.:format)           registrations#new 
     edit_user_registration GET  /edit(.:format)           registrations#edit 
           PUT /              registrations#update 
           DELETE /              registrations#destroy 

EDIT 3:

Więc ja testuje pewne rzeczy na zewnątrz, aw wymyślić szablon wiadomości e-mail, ścieżka edit_password_url jest tam i wor ks, aby wygenerować powyższy nieprawidłowy URL, ale gdy wykonuję rake routes, istnieje tylko edit_user_password_url.

Odpowiedz

3

Patrząc na Devise Controller URL Pomocnicy doc (znaleziono here), to użyłem:

edit_password_path(:user) co przekłada się edit_user_password_path. path wydaje się być wymienny z url.

nie jestem 100% pewien, ale to line definiuje metodę zwaną edit_password_path niniejsza line tworzy trasę w kontekście opracować ...

+0

Mam ten sam problem, ale nie mogę wymyślić, jak tego użyć .. czy jest jakakolwiek szansa, że ​​mogę uzyskać rada –

1

Nie opublikowałeś swojego routes.rb, ale zgaduję, że chcesz /password/edit, aby skierować do "Api/V1/RegistrationsController" bez adresu api/v1/ w adresie URL?

Jeśli tak, to musisz użyć opcji module routingu DSL. tak:

scope module: 'api/v1/' do 
    resources :sessions, :registrations 
end 

Oczywiście trzeba zintegrować powyższe devise_for rozmowy. Nie jestem devise ekspertem, jestem zgadywania, trzeba będzie użyć devise_scope zamiast scope tak:

devise_scope module: 'api/v1/' do 
    resources :sessions, :registrations 
end 

Uwaga: Jeśli powyższe nie działa. Po powrocie z numerem routes.rb. Pomożemy Ci to naprawić

+0

Dzięki za pomoc! Właśnie wysłałem moje trasy. Daj mi znać, jeśli potrzebujesz więcej. Opublikuję również dane wyjściowe z 'tras rake'u ' – Arel

+0

Dodanie' devise_scope' nie naprawiło wyjścia i spowodowało błąd routingu po wysłaniu e-maila: 'niezainicjowana stała SessionsController' – Arel

+0

Właśnie wysłałem moje trasy. Daj mi znać, jeśli potrzebujesz czegoś jeszcze. Nie rozumiem, dlaczego tak się dzieje, ponieważ wydaje mi się, że mam zwykłe 'edit_user_password' i' edit_api_v1_user_password' – Arel

0

Tak więc, o dziwo, musiałem zmienić ścieżkę w szablonie pocztowym devise. Zmieniłem go z edit_password_url, który działał w celu wygenerowania adresu URL, ale nie pojawił się na wyjściu rake routes, do edit_user_password_url, który znalazłem w moim wyjściu rake routes.

Chciałbym wiedzieć, dlaczego edit_password_url zadziałał, mimo że nie pojawia się na wyjściu rake routes i jestem bardziej niż szczęśliwy, że mogę przypisać poprawną odpowiedź komuś, kto może wyjaśnić, co się ze mną dzieje.

1

Zgodnie z tras, które są generowane powinieneś spróbować. W moim przypadku działa dobrze. Wypróbuj to:

edit_user_password_url(reset_password_token: @token) 
+0

można sformatować kod, umieszczając go w tylnych (') – amenthes