2012年10月28日 星期日

[宅] 宅男臥軌日記(4) - class及instance的method定義

在定義class中的method時,要注意究竟是給instance使用還是class

當以如下方式定義method時,代表這個method是要給class的instance使用
class User
  def say_hello
    puts "Hello"
  end
end
所以當執行User.say_hello時就會發生找不到method的情況,但在以下情形會是正常的:
user = User.new
user.say_hello
=>"Hello"

所以如果一個method希望能被class所使用,必須以以下方式定義:
class User
  def User.say_hello
    puts "Hello"
  end
end
或是
class User
  def self.say_hello
    puts "Hello"
  end
end
當然也可以用extend從module中mixin進來

[宅] 宅男臥軌日記(3) - load或require路徑

在ROR中,若想load或require其他module進來,要將module放在哪哩?
我們可以看看config/application.rb中的設定:
# Custom directories with classes and modules you want to be autoloadable.
    config.autoload_paths += %W(#{config.root}/lib)
上面這一段就是指定module所在的資料夾,其中config.root是指config/的母目錄。所以這樣的設定之下,我們就要將module放在lib/底下,在class中引用module時,ROR就會知道要到lib/底下找。

要注意的是檔名如果有多字都是小寫,字和字之間用底線區隔,像這樣:
omniauth_callbacks.rb

裡面的module得要這樣命名:
module OmniauthCallbacks