【问题标题】:ActiveSupport::Concern ClassMethod not being attached to host classActiveSupport::Concern ClassMethod 未附加到主机类
【发布时间】:2015-11-16 15:58:36
【问题描述】:

我有这个在models/concerns/sluggable.rb:

module Sluggable
    extend ActiveSupport::Concern

    module ClassMethods
        def sluggify(str, type)
            # ...
        end     
    end
end

我已将其包含在models/slug.rb:

class Slug < ActiveRecord::Base
    include Sluggable
    # ...
    before_save :create_slug

    private
        def create_slug
            self.slug = Slug.sluggify(self.title, 'item')
        end
end

我的印象是模块中的sluggify 方法现在应该可以作为Slug 的类方法使用,但似乎并非如此。尝试将模型插入数据库时​​出现undefined method: sluggify 错误。

Sluggable 模块可从 Rails 控制台获得。我可以确认我的代码是正确的:

module Sluggable
    def sluggify(str, type)
        # ...
    end
end

class SluggableTest
    extend Sluggable
end

slug = SluggableTest.sluggify('string to sluggify', 'item')

那么为什么我不能让它在模型中作为一个关注点工作呢?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4


    【解决方案1】:

    尝试在Slug 类的顶部添加include Sluggable,如下所示:

      class Slug < ActiveRecord::Base
        include Sluggable
        # ...
        before_save :create_slug
    
        private
    
        def create_slug
          self.slug = Slug.sluggify(self.title, 'item')
        end
      end
    

    因为,你是对的。一旦您在include Sluggable 类中的Sluggable 模块,sluggify 方法将附加到Slug 类,并且将作为Slug 类的类方法提供。我认为,因为在 Slug 类之上没有 include Sluggable,所以在 Sluggable 模块包含到 Slug 类之前调用​​了 sluggify 方法,因此它得到了 @987654335 @error,有道理!

    【讨论】:

    • 这不起作用。我仍然收到相同的 undefined method 'sluggify' 错误。这很奇怪!我还可能缺少什么?
    • 是的,这很奇怪。我在您发布的代码中没有看到任何其他问题:(
    • 我终于让它工作了,尽管我将模块移动到/lib 文件夹,配置了自动加载文件夹,最后在 Slug 模型类中扩展了模块而不使用ActiveSupport::Concern。谢谢你的时间,伙计。
    【解决方案2】:

    您在嵌套模块中定义您的方法,但不包含或扩展它。以下是正确的模板:

    module Sluggable
      module ClassMethods
    
      end
    
      module InstanceMethods
    
      end
    
      def self.included(receiver)
        receiver.extend         ClassMethods
        receiver.send :include, InstanceMethods
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 2012-09-14
      • 2015-12-29
      • 1970-01-01
      • 2011-10-14
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      相关资源
      最近更新 更多