【问题标题】:Module classes in lib folderlib 文件夹中的模块类
【发布时间】:2014-04-20 23:30:59
【问题描述】:

我有一个 lib 文件 lister_extension.rb

module ListerExtension
 def lister
  puts "#{self.class}"
 end
end

并发布模型

class Post < ActiveRecord::Base
  has_many :reviews
  extend ListerExtension
  def self.puts_hello
      puts "hello123123"
  end
end

当我在rails c 中调用时,一切都很好:

2.1.1 :003 > Post.lister
 Class
=> nil 

但是当我想向我的模块添加一个类时会发生什么?

例如:

module ListerExtension
 class ready
   def lister
    puts "#{self.class}"
   end
 end
end

我收到这个错误

TypeError: wrong argument type Class (expected Module)

当我在 rails c 中调用 Post.first

【问题讨论】:

  • 你为什么把类名写成ready而不是Ready

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


【解决方案1】:

来自extend的文档:

将每个模块的实例方法添加到 obj 中,作为 参数。

因此,您无法通过扩展类访问该类。查看包含模块而不是扩展它们(也可以阅读 ActionSupport::Concern 模块)或尝试使用 self.extended 方法(参考 here

【讨论】:

  • 我认为 extend 使所有函数成为类函数,而 include 使它们成为实例函数
  • @MohamedElMahallawy 不完全是,扩展使模块的所有方法都可以作为其他类/模块的单例方法使用。
【解决方案2】:

TL;DR ,在 ruby​​ 中你不能用类扩展,你可以用模块扩展/包含

问候

更新:关注示例 包含/扩展积极支持关注

module Ready
  extend ActiveSupport::Concern

  # this is an instance method
  def lister
    ....
  end

  #this are class methods
  module ClassMethods
    def method_one(params)
      ....
    end

    def method_two
      ....
    end
  end
end

然后在 ActiveRecord 模型中,例如 Post

class Post < AR
  include Ready
end

通过此程序,您将免费获得实例方法和类方法,还可以设置一些宏,例如使用包含块时,

module Ready

  extend ActiveSupport::Concern

  included do
    has_many :likes
  end
end

希望对你有帮助,

问候

【讨论】:

  • 是的,在 rails 中使用 ActiveSupport::Concern 来包含扩展类是一个好主意,但是你可以不使用它,只使用带有类方法和实例方法的模块,然后包含实例方法,并使用类方法扩展
  • 你有例子吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2011-03-22
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多