Разработать несколько путей для одной модели - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу иметь два разных маршрута для устройства:

  • localhost: 3000 / login - стандартное устройство разработки auth
  • localhost: 3000 / api / login - auth для вызовов API с использованиемдругой, не стандартный контроллер / api / session_controller

rout.rb

devise_for :users, path: '', path_names: { sign_in: 'login', sign_out: 'logout' }  
namespace :api, defaults: { format: :json } do
  devise_for :users,
             path: '',
             defaults: { format: :json },
             path_names: {
               sign_in: 'login',
               sign_out: 'logout',
              },
              controllers: { sessions: 'api/sessions' }
end

рельсы маршруты |grep sessio

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
new_api_user_session     GET     /api/login(.:format) api/sessions#new {:format=>:json}
api_user_session         POST    /api/login(.:format) api/sessions#create {:format=>:json}
destroy_api_user_session DELETE  /api/logout(.:format) api/sessions#destroy {:format=>:json}

api / session_controller.rb

class Api::SessionsController < Devise::SessionsController
skip_before_action :verify_authenticity_token
skip_before_action :authenticate_user!

respond_to :json

private

def respond_with(resource, _opts = {})
  render json: resource
end

def respond_to_on_destroy
  head :no_content
end
end

Этот код выглядит хорошо для меня, но когда я пытаюсь отправить POST-запросна мой localhost: 3000 / api / login с учетными данными аутентификации возвращается ошибка:

{"error": "Вам необходимо войти или зарегистрироваться перед тем, как продолжить."}

Если я закомментирую мои заданные по умолчанию маршруты разработки и переместлю маршруты api из пространства имен api, все будет хорошо, после запроса вернусь мне json с ресурсом: rout.rb

#devise_for :users, path: '', path_names: { sign_in: 'login', sign_out: 'logout' }  
devise_for :users,
             path: 'api',
             defaults: { format: :json },
             path_names: {
               sign_in: 'login',
               sign_out: 'logout',
              },
              controllers: { sessions: 'api/sessions' }

namespace :api, defaults: { format: :json } do
  ...
end

Почему это случилось?Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Имея это в моих маршрутах:

Rails.application.routes.draw do
  devise_for :users,
    path: '',
    path_names: {
      sign_in: 'login',
      sign_out: 'logout'
    }

  namespace :api, defaults: { format: :json } do
    namespace :users do
      devise_scope :user do
        post 'login', to: 'sessions#create', defaults: { format: :json }
      end
    end
  end    
end

rails routes выводит:

                                   Prefix Verb       URI Pattern                                              Controller#Action
                         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
                       api_v1_users_login POST       /api/v1/users/login(.:format)                            api/v1/users/sessions#create {:format=>:json}

Выполнение запроса POST для http://localhost:3000/api/v1/users/login работает, как ожидалось, и теперь получает доступ к перенаправлениям http://localhost:3000/loginна страницу входа в систему devise по умолчанию, и логин работает как надо.Проблема была в том, что у вас не может быть одного и того же devise_for дважды.Вы можете иметь devise_for :users и devise_for :admin_users, но не дважды для одного и того же, в данном случае :users.

0 голосов
/ 04 декабря 2018

Мой ответ:

rout.rb

devise_for :users, path: '', path_names: { sign_in: 'login', sign_out: 'logout' }
devise_scope :user do
   post 'api/login', to: 'api/sessions#create', as: 'api_login', defaults: {format: :json}
   get 'api/logout', to: 'api/sessions#destroy', as: 'api_logout', defaults: {format: :json}
end

Это похоже на ответ Гильермо Агирре.

0 голосов
/ 27 ноября 2018

Я думаю, что в вашем первоначальном определении маршрута вы уже находитесь в пространстве имен API, поэтому при определении вашего контроллера вам не нужно

'api/sessions'

, а просто

'sessions'

Я думаю, что из-за этого запрос попадет на правильный контроллер, что означает ваш authenticate_admin!Метод не сработает, что и происходит в данный момент, что приводит к вашей проблеме с аутентификацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...