【问题标题】:Accessing helpers within the model in the controller在控制器的模型中访问助手
【发布时间】:2020-12-27 14:13:18
【问题描述】:

我想知道为什么当我尝试调用该模型受保护的方法时,我与模型混合的模块中有一个辅助方法在我的控制器中抛出 NoMethodError。我的代码目前看起来像这样。

#models/my_class.rb

class MyClass
  include HelperModule
    
  def self.list_payments(payments)
     new_payments = []
     payments.each do |payment|
        payment = MyClass.new.tap do |p|
           p.quality_check = quality_check(payment)
           p.amount_with_fee = calculate_fees(payment)
        end

        if payment.valid?
          payment.save
          new_payments << payment
        end
     end
     new_payments
  end
end

 #controllers/my_classes_controller

 class MyClassController < ApplicationController
     def index
        response = Faraday.get
        unfiltered_payments = JSON.parse(response.body)["payments"]
        @payments = MyClass.list_payments(unfiltered_payments)
     end
 end

quality_check 和 calculate_fees 都在我的辅助模块中,但在控制器中,当我调用 MyClass.list_payments(payments) 时,两种方法都会得到 NoMethodError。我可以通过在我的控制器中包含助手并将此函数用作我的控制器中的私有函数来使其工作,但我试图遵循胖模型/瘦控制器约定。我在这里遗漏了什么还是可以将助手放在控制器中并将此功能移至控制器? 使用ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin20]和Rails 6.1.0

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-6.1


    【解决方案1】:

    这是因为def self.list_payments 是一个类方法,但你调用的include HelperModule 只影响实例方法 范围。

    快速修复,只需将include 替换为extend。

    【讨论】:

    • 非常感谢马克斯!可悲的是,不久前我刚刚读到这个。看来我得回去看看了!
    • 可以理解。这东西可能有点令人困惑。仅复制模块的实例方法,但它们是否被复制到其他类的实例或类范围取决于您使用的是extend 还是include ...
    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 2020-07-03
    • 1970-01-01
    • 2011-09-23
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多