Я пытаюсь решить проблему с драгоценным камнем. Проблема заключается в использовании стандартного устройства с devise_token_auth.Переопределения контекста класса Методы модулей с тем же именем?
В application_controller.rb, devise_token_auth требует добавления модуля:
class ApplicationController < ActionController::Base
include DeviseTokenAuth::Concerns::SetUserByToken
После добавления этого SetUserBytToken модуль, я загружаю путь пользователей/sign_in в браузере (а не/API/v1/авториз/войти в систему). Путь users/sign_in должен загружаться, а не devise_token_auth.
Однако я получаю сообщение об ошибке:
wrong number of arguments (given 1, expected 0) def resource_class
devise_token_auth
вызывающую это в set_user_by_token.rb:
def set_user_by_token(mapping=nil)
# determine target authentication class
rc = resource_class(mapping)
Существует метод в том же файле, который выглядит следующим образом:
def resource_class(m=nil)
Таким образом, этот метод принимает аргумент DEFAULT. Однако вы видели ошибку, верно?
wrong number of arguments (given 1, expected 0)
Так что этот метод должен быть перезаписан каким-то образом. Проверьте это:
http://www.rubydoc.info/github/plataformatec/devise/DeviseController%3Aresource_class
Разрабатывают имеет метод с тем же именем, что не принимает необязательный аргумент. Я не понимаю, как этот метод может переопределять тот, который определен в модуле SetUserByToken. Так как я вызываю метод в SetUserByToken, не должен ли ruby смотреть на тот, который определен в модуле, а не где-то еще? https://github.com/lynndylanhurley/devise_token_auth/blob/master/app/controllers/devise_token_auth/concerns/set_user_by_token.rb
Ваша иерархия по наследству не ясна для меня. Однако, перейдя по названию вашего вопроса: «Класс context переопределяет методы модуля с тем же именем?» Да, так оно и работает. 'класс C; include M end' делает 'M' суперклассом' C', вот и все. Так как 'M' является суперклассом' C' (или, глядя на него с другой стороны, 'C' является подклассом' M'), методы, определенные в методах переопределения 'C', определенные в' M', это как раз то, как наследование работает. Если вы хотите, чтобы методы 'M' переопределяли' C', вам нужно использовать 'prepend', который помещает' M' в * front * списка 'ancestors'. –
Да, вы ответили на мой вопрос. Тем не менее, я перешел к первому уникальному жемчужину simple_token_authentication. У этого нет власти и есть больше проблем, чем то, что я описал выше. – Donato
Хорошо. Я почти уверен, что есть дубликат вопроса, но я не могу найти его в данный момент. Возможно, кто-то другой с лучшими навыками поиска может закрыть вопрос. Тем временем я собираюсь ответить на быстрый ответ. –