После обновления до Rails 5 и Devise 4.0.0.rc1 devise authentication_user! метод не определен

У меня было приложение rails, которое отлично работало с devise 3 и rails 4. Я обновил rails до 5, и оно выдало DEPRECATION WARNING: alias_method_chain is deprecated. Поэтому мне пришлось изменить версию устройства на 4.0.0.rc1.

Теперь кажется, что устройство не генерирует такие методы, как authenticate_user!, is_admin и т. д.

Я получаю следующую ошибку

Before process_action callback :authenticate_user! has not been defined (ArgumentError)

Я пробовал все, в том числе, удалить devise и установить снова, затем попытался создать отдельную модель с нуля, и все равно методы не определены.

Любые идеи, пожалуйста?


person Hassan    schedule 14.02.2016    source источник
comment
Есть ли обновления по этому поводу? Я пытаюсь реализовать постепенное взаимодействие на рельсах 5 и получаю аналогичные ошибки после вики.   -  person Kevin Brown    schedule 09.04.2016
comment
Я не уверен, какие именно ошибки вы получаете, в моем случае это было обновление функции в rails5, где его можно просто исправить, добавив дополнительный параметр, я упомянул об этом в принятом ответе. Я мог бы выяснить проблему, проверив файлы, поместив оператор отладки binding.pry. Если вы запускаете его из терминала, вы можете получить путь к файлу и номер строки, которые выдают ошибку, поэтому просто не бойтесь погрузиться в это.   -  person Hassan    schedule 09.04.2016


Ответы (3)


Ответ для этого состоит в том, чтобы просто изменить:

skip_before_action :authenticate_user!

to ---

skip_before_action :authenticate_user!, raise: false

https://github.com/plataformatec/devise/issues/4207 https://github.com/thoughtbot/clearance/issues/621

person hellion    schedule 22.07.2016
comment
Это безопасно, кажется немного хакерским? - person Richard Peck; 18.01.2017

Я мог определить проблему, в рельсах 5 будет исключение, если метод пропуска не определен во время вызова, если мы не добавим условие :unless.

person Hassan    schedule 16.02.2016
comment
можете ли вы предоставить более подробную информацию, как вы это исправили, пожалуйста? - person Yannick Schuchmann; 19.02.2016
comment
пока я установил config.eager_load = false в config/environments/production.rb в качестве обходного пути. - person Yannick Schuchmann; 19.02.2016
comment
Проблема заключалась в том, что в rails 5 опция обратного вызова skip будет вызывать исключение, если метод, который нужно пропустить, не определен. В моем коде я пропускаю аутентификацию_пользователя! метод при инициализации приложения, в то время метод не определен, devise определяет методы позже. Если мы хотим, чтобы рельсы не выдавали исключение, мы должны использовать другое предложение, подобное следующему: Devise::SessionsController.skip_before_action :authenticate_user!, raise: false - person Hassan; 20.02.2016
comment
Это совершенно сбивает с толку. Когда ты пропускаешь это? Почему? Как это на самом деле решает проблему? - person tirdadc; 06.07.2016
comment
@YannickSchuchmann Я понятия не имею, почему это сработало, но спасибо. - person dps; 14.04.2019

Пока поддержка rails5 не появится в самой разработке, вы можете попробовать использовать эту вилку:

gem 'devise', github: 'twalpole/devise', branch: 'rails5'
person failpractice    schedule 13.03.2016
comment
Это могло бы сделать с некоторым дополнительным объяснением. - person Joseph Lord; 16.03.2016
comment
Это, вероятно, устарело - этой вилке 3 месяца, и мастер разработки теперь имеет аналогичные изменения. - person Vasfed; 16.03.2016