Как заставить Angular хорошо играть с маршрутами Rails?

0

Я использую Rails 4.2.3, Devise и AngularJS. Я настроил Devise так, чтобы он принимал и отображал JSON, а остальное мое приложение Rails - это всего лишь API, который также дает JSON в ответе.

Моя угловая конфигурация выглядит так:

angular.module('beer', ['ngRoute']).
    config(['$routeProvider', function($routeProvider) {
        $routeProvider.when('/beers', {
            templateUrl: "../templates/beers.html",
            controller:  "BeersCtrl"
        }).otherwise({
            templateUrl: "../templates/login.html",
            controller:  "LoginCtrl"
        });
    });

Проблема, с которой я сталкиваюсь, заключается в том, что если кто-то посещает URL-адрес и срок его действия истек, Devise будет перенаправлять на /users/sign_in чтобы иметь возможность входа в систему. Если исходный URL-адрес, который был посещен, похож на http://localhost:3000/#/beers и они не аутентифицированы, Devise перенаправляет на http://localhot:3000/users/sign_in/#/beers

При перенаправлении Угловая сторона все еще видит маршрут /beers, и поэтому страница входа в систему не отображается. Я не уверен, как получить Rails или Angular, чтобы узнать URL друг друга и правильно их обработать.

Например, есть ли способ перенаправить Rails на нечто вроде http://localhost:3000/#/users/sign_in или, возможно, есть способ, чтобы Angular видел http://localhost:3000/users/sign_in и знал что он должен загрузить LoginCtrl? Или, есть что-то, чего я пропускаю, что сделало бы эту вещь намного легче выполнить?

  • 0
    Вы не должны обслуживать страницу индекса из users/sign_in ... она должна направляться обратно к корню во всех случаях, которые не являются активами или путями API. Ваша проблема с конфигурацией сервера .. не угловой
  • 0
    Я не совсем уверен, что вы имеете в виду. В настоящее время я просто использую сервер rails, webbrick. Единственная конфигурация, которая выполняется, devise_for :users с devise_for :users и resources :beers в моем файле rout.rb ... Devise - это то, что перенаправляет на /users/sign_in когда он выполняет действие, требующее аутентификации, но пользователь в настоящее время не аутентифицирован ,
Показать ещё 3 комментария
Теги:
routes
devise
angular-routing

1 ответ

0

@charlietfl дал мне немного намека на комментарии к моему вопросу. То, что я закончил, немного изменило мои маршруты Rails. Я помещал материал для разработки, а также мой BeersController внутри пространства имен, и любой маршрут, который не имеет доступа к чему-либо в этом пространстве имен, перенаправляется на страницу индекса с хешем.

Например; Если пользователь посещает /beers маршруты маршрутов поймают это и изменят его на /m/#/beers. /m/ отображает application#index в моих маршрутах Rails.

Итак, файл Rails routes.rb выглядит так:

Rails.application.routes.draw do
    namespace :api do
        devise_for :users, :controllers => {
            sessions: 'sessions',
            registrations: 'registrations'
        }
        resources :beers
    end

    root 'application#index'

    get '/m/' => 'application#index'
    get '*path' => redirect('/m/#/%{path}')
end

Мои угловые маршруты выглядят одинаково.

Side Note: По какой-то странной причине я не мог получить redirect('/') для работы. Кажется, что в Rails 4.2.3 просто использование аргумента / в качестве аргумента для redirect ничего не делает, поскольку по какой-то причине он не считает, что ссылается на абсолютный URI, делая это. Так, например, если пользователь перешел на http://blah.com/cats/meow перенаправление Rails просто перенаправило бы тот же URL. Я ожидаю, что он перенаправит на http://blah.com/, но это не так.

Кроме того: если у вас возникли проблемы с Devise, когда вы пытаетесь отправить сообщение на него и вернуть JSON, убедитесь, что вы публикуете в /api/users/sign_in.json и ваша полезная нагрузка выглядит примерно так:

api_user: {
    email: 'email',
    password: 'password'
}

Это заставило меня немного зациклиться, так как я не ожидал, что полезная нагрузка изменится с пространством имен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню