gem overwrite


#1

如題,如果說今天有個gem他的名字叫ffaker ,沒錯,就是他 faker。

# vendor/extensions/ffaker/lib/ffaker/ip_address.rb

require 'ffaker'
module Faker
  module Internet
    def ip_address
      return "#{rand(256)}.#{rand(256)}.#{rand(256)}.#{rand(256)}"
    end
  end
end

這是一個 extend 給 faker,想要多一個method 給faker。可是當在rails console裡

ls Faker::Internet

Faker::ModuleUtils#methods: k
Faker::Internet#methods: disposable_email  domain_name  domain_suffix  domain_word  email  free_email  http_url  ip_v4_address  uri  user_name
Faker::Internet#methods: disposable_email  domain_name  domain_suffix  domain_word  email  free_email  http_url  ip_v4_address  uri  user_name

沒這個方法說


#2

… 人家套件名稱叫做 “FFaker”,而你想覆蓋多一個 method 的 module 叫 “Faker” …這兩個會一樣!?& 這兩個還是不同的 gem 的,你會不會弄錯了|||

https://github.com/ffaker/ffaker/blob/master/lib/ffaker.rb

明明就叫 FFaker 請用同名覆蓋啊啊啊啊啊啊啊啊啊啊啊

and 人家明明就有一個 method 叫 ip_v4_address

自己 alias method 應該就好了,沒必要在另外幹一個的啊…
& 這邊用的寫法是 overwrite 而不是 extend …Orz"

最後,你發覺你要的東西還是沒有的話,我不確定你是用 mixin 還是直接用它,可以嘗試把

def ip_address ; end

改成

def self.ip_address ; end

說不定你的問題就解決了,因為他的code裡面有一句

extend self

簡單的 demo

module A
  def temp
    puts 123
  end
  extend self
end
A.temp #=> 123

大概就是不想寫類似 def self.temp 的 code 重複一次,所以就自己繼承自己還可以被人 mixin 的寫法,so~ 你自己寫兩個就會是一樣的意思的,下面同義

module A
  def temp
    puts 123
  end
  def self.temp
    puts 123
  end
end
A.temp #=> 123

以上


#3

這是舊版本 rails 3.2的 ffacker ,所以他的class 是 faker 啦XD!


#4

好啦anyway,extend self 是重點,所以我已經解釋光了才是