简体   繁体   中英

Module classes in lib folder

I have a lib file lister_extension.rb

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

And Post model

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

All is good when I call this in rails c :

2.1.1 :003 > Post.lister
 Class
=> nil 

But what happens when I want to add a class to my module?

For example:

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

I get this error

TypeError: wrong argument type Class (expected Module)

When I call Post.first in rails c

TL;DR , in ruby you can´t extend with classes, you extend/include with modules

regards

updated: example for concern include / extend with activesupport concern

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

then in a ActiveRecord Model , like Post

class Post < AR
  include Ready
end

with this procedure you will get the instance methods and class methods for free, also you can set some macros like when use a included block,

module Ready

  extend ActiveSupport::Concern

  included do
    has_many :likes
  end
end

hope that helps,

regards

From the doc for extend :

Adds to obj the instance methods from each module given as a parameter.

Hence, you can't access this class through extended class. Have a look into including modules instead of extending them (read about ActionSupport::Concern module as well) or have a go with self.extended method (ref here )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM