2017-01-27 4 views
0

Я пытаюсь решить проблему с драгоценным камнем. Проблема заключается в использовании стандартного устройства с 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

+1

Ваша иерархия по наследству не ясна для меня. Однако, перейдя по названию вашего вопроса: «Класс context переопределяет методы модуля с тем же именем?» Да, так оно и работает. 'класс C; include M end' делает 'M' суперклассом' C', вот и все. Так как 'M' является суперклассом' C' (или, глядя на него с другой стороны, 'C' является подклассом' M'), методы, определенные в методах переопределения 'C', определенные в' M', это как раз то, как наследование работает. Если вы хотите, чтобы методы 'M' переопределяли' C', вам нужно использовать 'prepend', который помещает' M' в * front * списка 'ancestors'. –

+0

Да, вы ответили на мой вопрос. Тем не менее, я перешел к первому уникальному жемчужину simple_token_authentication. У этого нет власти и есть больше проблем, чем то, что я описал выше. – Donato

+0

Хорошо. Я почти уверен, что есть дубликат вопроса, но я не могу найти его в данный момент. Возможно, кто-то другой с лучшими навыками поиска может закрыть вопрос. Тем временем я собираюсь ответить на быстрый ответ. –

ответ

0

Class context overrides Module methods with the same name?

Да, так оно и есть.

class C 
    include M 
end 

делает M суперкласс C, что все это делает.

Поскольку M является суперкласс C (или смотреть на него с другой стороны C подкласс M), методы, определенные в C переопределяют методы, определенные в M, что это просто, как работает наследование.

Если вы хотите M «методы s переопределить C» с, вы должны использовать PREPEND, который ставит M перед ancestors списка.


Точнее, включают в себя классM′ создается чей класс переменной указатель таблицы, постоянный указатель таблицы, и точка таблицы методов указателя на M «ы таблицы переменного класса, M„постоянной таблицы с, и M“ . Верхний указатель M′ для суперкласса установлен на C, а затем указатель суперкласса C установлен на M′.Методы Object#class и Class#superclass знают, что «пропускают» одноэлементные классы и включают классы, а Module#ancestors знает, как вернуть соответствующий модуль вместо класса include, поэтому вы не см., это работает, но это то, что происходит.

Это объясняет, почему методы, определенные в методах переопределения класса, определенные во включенном модуле. Это также объясняет поведение super с модулями. Это просто прямое наследование класса.

Смежные вопросы