rspec: метод помощников на модели неопределенный метод - PullRequest
0 голосов
/ 20 октября 2019

У меня проблема с методом помощников, включенным в мою модель.

Я включаю своих помощников следующим образом:

class Booking < ApplicationRecord
  include BookingsHelper
  include PaymentsHelper

Оба из BookingsHelper и PaymentsHelper имеют функцию slack_notify. Поэтому для вызова хорошей функции slack_notify я вызываю эту функцию, как показано ниже:

BookingsHelper.slack_notify(self)
PaymentsHelper.slack_notify(requester.email, 'danger', 'booking:proceed_payment', e.message)

Когда я запускаю свой тест (с помощью rspec), я получаю:

     Failure/Error: BookingsHelper.slack_notify(self)

     NoMethodError:
       undefined method `slack_notify' for BookingsHelper:Module

И язаметил, если я изменю: BookingsHelper.slack_notify(self) на slack_notify(self), это работает, но назову slack_notify в PaymentsHelper, поэтому я не совсем понимаю, что происходит. И если я уберу PaymentHelper, он назовет хороший

Если бы кто-то мог рассказать мне об этом поведении, мне было бы очень интересно понять, что происходит

Спасибо

1 Ответ

1 голос
/ 20 октября 2019

Вы используете Mixin здесь.

Миксин в основном можно рассматривать как набор кода, который можно добавить к одному или нескольким классам для добавления дополнительных возможностей без использования наследования. В Ruby миксин - это код, заключенный в модуль, который класс может включать или расширять

Вы не обращаетесь к вспомогательным методам, таким как статические, но вызываете их напрямую, в вашем примере вы должны вызватьslack_notify напрямую, без имени модуля ранее. Когда вы включаете два модуля с одинаковым именем метода, последний переопределяет предыдущий. Если вы не хотите, чтобы он был переопределен, вы должны определить в модуле так:

def BookingsHelper.slack_notify
  // your code
end

и

def PaymentsHelper.slack_notify
  // your code
end

см. Пример о sin и cosздесь: https://www.tutorialspoint.com/ruby/ruby_modules.htm

Узнайте больше о миксинах, и вы лучше поймете, что здесь происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...