12

我有我的 Rails 应用程序和 Devise 设置为使用 JSON API 进行用户注册和登录。一个副作用是,edit_password_url在密码重置电子邮件中意外地将用户发送到:

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

当它不api/v1/应该有时,应该将它们发送到:

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

我一直在寻找,但无法弄清楚在哪里解决这个问题。

我创建了以下内容:

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

Api::V1::RegistrationsController < RegistrationsController

我有一个从 devise 继承的常规 RegistrationsController,但不是常规的 SessionsController,所以我只是直接从 devise 那里继承。

谢谢您的帮助!

编辑:

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

编辑2:rake routes输出

        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

编辑 3:

所以我一直在测试一些东西,在设计电子邮件模板中,路径edit_password_url在那里,并且可以生成上述错误的 url,但是当我这样做时rake routes,只edit_user_password_url存在。

4

4 回答 4

3

查看 Devise Controller URL Helpers 文档(在此处找到),我会使用:

edit_password_path(:user)转换为edit_user_password_path. path似乎可以与url.

我不是 100% 确定,但这一行定义了一个名为的方法edit_password_path,而这一行在设计上下文中创建了一个路由......

于 2013-08-15T22:20:31.200 回答
1

根据生成的路线,您应该尝试一下。就我而言,它工作正常。尝试这个:

edit_user_password_url(reset_password_token: @token)
于 2015-01-06T14:58:42.590 回答
1

你还没有发布你的routes.rb,但我猜你想在没有URL/password/edit的情况下路由到“Api/V1/RegistrationsController” ?api/v1/

如果是,那么您需要使用module路由 DSL 选项。像这样:

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

devise_for当然,您需要在调用中集成上述内容。我不是设计专家,我猜,你需要使用devise_scope而不是scope这样:

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

注意:如果上述方法不起作用。用您的routes.rb. 我们将帮助您修复它

于 2013-08-15T19:24:54.450 回答
0

所以,奇怪的是,我需要更改设计邮件模板中的路径。我将其更改为edit_password_url可以生成 url,但没有出现在我的rake routes输出中,edit_user_password_url我在rake routes输出中找到了它。

我很想知道为什么会edit_password_url起作用,即使它没有出现在rake routes输出中,并且非常乐意将正确的答案分配给能够解释发生在我身上的事情的人。

于 2013-08-15T20:09:56.017 回答