Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rspec:模型未定义方法上的Helpers方法_Ruby On Rails_Ruby_Rspec_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails rspec:模型未定义方法上的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方法有问题 我包括我的助手如下: 订舱

我的模型中包含的helpers方法有问题

我包括我的助手如下:

订舱
BookingsHelper
PaymentsHelper
都具有
slack\u notify
功能。 因此,为了调用good
slack\u notify
函数,我调用该函数如下:

BookingsHelper.slack_notify(self)
PaymentsHelper.slack_notify(requester.email, 'danger', 'booking:proceed_payment', e.message)
当我运行测试(使用rspec)时,我得到:

我注意到如果我改变了:
BookingsHelper.slack\u notify(self)
by
slack\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