Я использую 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? Или, есть что-то, чего я пропускаю, что сделало бы эту вещь намного легче выполнить?
@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'
}
Это заставило меня немного зациклиться, так как я не ожидал, что полезная нагрузка изменится с пространством имен.
users/sign_in
... она должна направляться обратно к корню во всех случаях, которые не являются активами или путями API. Ваша проблема с конфигурацией сервера .. не угловойdevise_for :users
сdevise_for :users
иresources :beers
в моем файле rout.rb ... Devise - это то, что перенаправляет на/users/sign_in
когда он выполняет действие, требующее аутентификации, но пользователь в настоящее время не аутентифицирован ,