Ruby on rails rspec:模型未定义方法上的Helpers方法
我的模型中包含的helpers方法有问题 我包括我的助手如下:Ruby on rails rspec:模型未定义方法上的Helpers方法,ruby-on-rails,ruby,rspec,ruby-on-rails-5,Ruby On Rails,Ruby,Rspec,Ruby On Rails 5,我的模型中包含的helpers方法有问题 我包括我的助手如下: 订舱
订舱
BookingsHelper
和PaymentsHelper
都具有slack\u notify
功能。
因此,为了调用goodslack\u notify
函数,我调用该函数如下:
BookingsHelper.slack_notify(self)
PaymentsHelper.slack_notify(requester.email, 'danger', 'booking:proceed_payment', e.message)
当我运行测试(使用rspec)时,我得到:
我注意到如果我改变了:BookingsHelper.slack\u notify(self)
byslack\u notify(self)
它可以工作,但是在PaymentsHelper
中调用slack\u notify
,所以我真的不明白发生了什么。如果我删除了PaymentHelper
它就称之为好的
如果有人能强调我的这种行为,我真的很想了解到底发生了什么
谢谢你在这里使用Mixin mixin基本上可以看作是一组可以添加的代码 添加到一个或多个类以添加附加功能,而无需使用 遗产在Ruby中,mixin是封装在模块中的代码,该模块 类可以包括或扩展 您不能像静态方法那样访问帮助器方法,但可以直接调用它们,在您的示例中,您应该直接调用
slack\u notify
,而之前没有模块名。
当包含两个具有相同方法名的模块时,最后一个模块将覆盖前一个模块。
如果不希望覆盖它,则必须在模块中定义如下:
def BookingsHelper.slack_notify
// your code
end
及
请参见此处有关sin
和cos
的示例:
阅读更多关于mixin的内容,您将更好地理解这里发生的事情。您假设Ruby生成每个模块函数的静态版本-事实并非如此。@maxpleaner感谢您的回答,但我肯定能准确理解您的意思这里使用术语“helper”是不合适的。Rails中的帮助程序是在控制器和视图层中使用的模块,但在模型层中几乎从未使用过。用于干燥模型的模块称为
关注点
,通常以它实际带来的特性命名,例如可注释性
。术语“静态方法”并不适合Ruby。Ruby有类和模块方法,它们与“常规”实例方法的唯一真正区别在于它们附加到类或模块类的实例。它没有像Java或PHP那样的static
关键字。
def BookingsHelper.slack_notify
// your code
end
def PaymentsHelper.slack_notify
// your code
end