我的模型中包含辅助方法的问题。
我将我的助手包括如下:
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
,则称其为“好人”
[如果有人可以在这种行为上突出我,我真的很想了解发生了什么事情
谢谢
您在这里使用Mixin。
基本上可以将mixin视为可以添加的一组代码一个或多个类以添加其他功能,而无需使用遗产。在Ruby中,mixin是包装在模块中的代码,类可以包括或扩展
您不会像静态方法那样访问辅助方法,而是直接调用它们,在您的示例中,您应直接调用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
阅读有关mixin的更多信息,您将对这里发生的事情有更好的了解。