Я попробую объяснение 4-го класса:
Все очень просто. A prototype
- пример того, как что-то должно быть построено. Итак:
function
, и я строю новые объекты, похожие на мои prototype
object
, и я был построен с использованием моего __proto__
в качестве примера доказательство:
function Foo() { }
var bar = new Foo()
// `bar` is constructed from how Foo knows to construct objects
bar.__proto__ === Foo.prototype // => true
// bar is an instance - it does not know how to create objects
bar.prototype // => undefined
Метод destroy
¹ SessionsController
содержит следующую строку:
signed_out = Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
Метод sign_out_all_scopes
² вызывает warden.logout
без каких-либо аргументов, а вызов метода sign_out
³ warden.logout(scope)
.
Документация метода logout
⁴ гласит:
blockquote># Logout everyone and clear the session env['warden'].logout # Logout the default user but leave the rest of the session alone env['warden'].logout(:default)
Заключение:
sign_out
должен сохранять сеанс при задании определенный объем. Однако я не вижу никакого способа сделать это.sign_out_all_scopes
всегда всегда называется первым и будет возвращать толькоfalse
, если он не смог зарегистрировать пользователя.Я рекомендую либо опубликовать запрос функции на их трекер проблемы или разработка собственного решения для проверки подлинности. Rails теперь предоставляет
has_secure_password
, и в эти дни люди, похоже, собираются для последнего, чтобы избежать столкновения с этими проблемами.
¹
Devise::SessionsController#destroy
²
Devise::Controllers::Helpers#sign_out_all_scopes
В дополнение к Маттею. Утверждение
signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
является, пожалуй, лучшим общим изложением вывода, учитывая возможность входа в систему с несколькими ролями. Если для вашего случая ваш пользователь только что подписан как одна роль, и вы хотите сохранить остальную часть сеанса при выводе, самый простой способ:
$ git clone git://github.com/plataformatec/devise.git
$ cd devise
$ git branch my_devise
$ git checkout my_devise
Открыть приложение / контроллеры /devise/sessions_controller.rb в вашем редакторе. В методе destroy замените
signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
на
signed_out = sign_out(resource_name)
Сохранить и выйти из редактора и сделать
$ git commit -am "remove only warden data from session on logout, preserve other data."
В Gemfile вашего проекта, описать зависимость для разработки, например
gem 'devise', :path => "[YOUR PATH]/devise", :branch => "my_devise"
Вы можете просто переопределить SessionController от Devise, как я сделал, чтобы сохранить корзину:
sessions_controller.rb
class SessionsController < Devise::SessionsController
def destroy
order_id = session[:order_id]
super
session[:order_id] = order_id
end
end
routes.rb
devise_for :users, :controllers => { :sessions => "sessions" }
В последних версиях разработки нет необходимости переопределять контроллер сеансов, вместо этого вы можете просто использовать:
config.sign_out_all_scopes = false
В файле devise.rb
для получения желаемого поведения.
Devise.sign_out_all_scopes
является логическим: github.com/plataformatec/devise/blob/… – Reed G. Law 1 September 2017 в 16:50