【问题标题】:rspec: Helpers Method on Model undefined methodrspec:模型未定义方法上的辅助方法
【发布时间】:2019-10-20 14:47:59
【问题描述】:

我的模型中包含 helpers 方法时遇到问题。

我的助手如下:

class Booking < ApplicationRecord
  include BookingsHelper
  include PaymentsHelper

BookingsHelperPaymentsHelper 都具有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) 它可以工作,但在 PaymentsHelper 中调用 slack_notify 所以我真的不明白发生了什么。如果我删除了PaymentHelper,它就会调用好一个

如果有人能强调我的这种行为,我真的很想了解发生了什么

谢谢

【问题讨论】:

  • 您假设 Ruby 生成每个模块函数的静态版本 - 事实并非如此。
  • @maxpleaner 感谢您的回答,但我一定会明白您的意思
  • 这里使用术语“助手”是不恰当的。在 Rails 中,帮助程序是在控制器和视图层中使用但几乎从不在模型层中使用的模块。用于 DRY 模型的模块称为 concern,通常以它实际带来的功能命名,例如 Commentable

标签: ruby-on-rails ruby rspec ruby-on-rails-5


【解决方案1】:

你在这里使用 Mixin。

mixin 基本上可以被认为是一组可以添加的代码 到一个或多个类以添加其他功能而不使用 遗产。在 Ruby 中,mixin 是封装在一个模块中的代码, 类可以包含或扩展

您不会像静态方法那样访问辅助方法,而是直接调用它们,在您的示例中,您应该直接调用 slack_notify 而之前没有模块名称。 当您包含两个具有相同方法名称的模块时,最后一个会覆盖前一个。 如果您不希望它被覆盖,那么您必须像这样在模块中定义:

def BookingsHelper.slack_notify
  // your code
end

def PaymentsHelper.slack_notify
  // your code
end

在此处查看有关sincos 的示例:https://www.tutorialspoint.com/ruby/ruby_modules.htm

阅读有关 mixins 的更多信息,您将对这里发生的事情有更好的理解。

【讨论】:

  • 术语“静态方法”并不适合 Ruby。 Ruby 具有类和模块方法,它们与“常规”实例方法之间唯一真正的区别是它们附加到 Class 或 Module 类的实例。它没有像 Java 或 PHP 这样的 static 关键字。
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 2011-11-19
  • 1970-01-01
  • 2015-11-12
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
相关资源
最近更新 更多