ruby 从Rails模型中的类和示例方法调用帮助器

brgchamk  于 2022-11-04  发布在  Ruby
关注(0)|答案(3)|浏览(167)

我需要在一个模型中调用一个helper方法,从一个类和一个示例方法中调用,例如Model.method(data)model_instance.method。未定义#的方法'helper_method'”

型号.rb:

class Model < ActiveRecord::Base
  include ModelHelper

  def method
    helper_method(self.data)
  end

  def self.method(data)
    self.helper_method(data)
  end
end

模型助手.rb:

module ModelHelper
  def helper_method(data)
    # logic here
  end
end

我甚至尝试在助手中添加def self.helper_method(data),但都无济于事。
经过相当多的搜索,我无法找到任何关于如何实现这一点,或至少任何工作。

mutmk8jj

mutmk8jj1#

答案很简单,不需要任何Rails技巧:您只需重新包含helper并在类块中定义类方法:

class Model < ActiveRecord::Base
  include ModelHelper

  def method
    helper_method(self.data)
  end

  # Expose Model.method()
  class << self
    include ModelHelper

    def method(data)
      helper_method(data)
    end
  end
end

根本不需要对助手进行任何更改。
现在您可以在类和示例上调用method了!

e37o9pze

e37o9pze2#

如果method中没有其他逻辑,那么您可以简单地执行以下操作:

class Model < ActiveRecord::Base
  include ModelHelper
  extend  ModelHelper
end

并同时获取示例(@model.helper_method)和类(Model.helper_method)方法。
如果由于遗留(或其他)原因,您 * 仍然 * 希望使用method作为示例 * 和 * 类方法,但methodhelper_method没有任何不同,那么您可以执行以下操作:

class Model < ActiveRecord::Base
  include ModelHelper
  extend  ModelHelper

  alias method helper_method
  singleton_class.send(:alias_method, :method, :helper_method)
end

现在您可以执行@model.methodModel.method
顺便说一句,使用模块在类中包含方法是很诱人的,但是如果你不小心的话,很快就会离开你,让你做很多@model.method(:foo).source_location,试图找出一些东西是从哪里来的。问我怎么知道的...

mwkjh3gx

mwkjh3gx3#

您需要将model_helper.rb定义为:

module ModelHelper
  def self.helper_method(data)
    # logic here
  end
end

并在model.rb中调用此方法,如下所示:

class Model < ActiveRecord::Base
  include ModelHelper

  def method
    ModelHelper.helper_method(self.data)
  end

  def self.method(data)
    ModelHelper.helper_method(data)
  end
end

相关问题