2017年5月7日 星期日

第三次上五倍紅寶石rails課 5/7

其實和上一次隔了好久,不過講真的有些東西我真的久了就忘了,不過每多上一次還是有比之前輕鬆,畢竟最一開始的時候什麼都不知道,光要消化那些我不知道的東西就飽了。 但是現在比較可以專心在自己比較不了解的東西。

所以勒,想說來試著上完課以後做一下筆記,為什麼前兩次沒有筆記勒? 因為我從大學就被說“單人單工”,要一個連邊走路邊講電話都做不到的人邊上課邊做筆記怎麼可能,聽不懂的東西還是先聽比寫下來重要。

如果有哪邊寫錯的話,希望好心人可以提醒我一下。


public / private / protected

其實聽了好幾次,但每次到最後proteced都被我遺忘(遠目),因為真的不太有存在感...... ###public 就是public,任何人都可以用,大家的好朋友。 ###private 最重要的就是private 呼叫的時候不可以有receiver, 比方說不能像下面這樣

xxx.private_method

但是真的很想叫他的話可以用下面這樣

xxx.send(:private_method)

但是沒特別需要是不需要這樣做的..

protected

如果是在class外的話和private結果一樣,但是如果是在class裡面的話,他是可以有receiver的,比方說

self.private_method

但是一般好像不太有使用protected的必要


class / module

兩個寫起來非常像的東西,不過會像也是有原因的 (然後我的頭腦一直記不起來class中文是講類別)

2.3.3 :011 > Class.superclass
 => Module

原來module是class的老爸來的(?) 那順便看一下class到底有哪些method是他自己的,就可以知道他們差在哪了

2.3.3 :015 >  Class.instance_methods(false)
 => [:new, :allocate, :superclass]

只差了三個method呢~ 所以少了這三個method的module是沒有辦法繼承,也沒有辦法new的

那如果繼承的class和include的module有同名的method的話,到底會誰被執行呢? 借一下上課用的例子

module Flyable
  def fly
    puts "I can Fly~~"
  end
end

class Animal
  def fly
    puts "Animal~~"
  end
end

class Cat < Animal
  include Flyable
end

kitty = Cat.new
kitty.fly
p Cat.ancestors

結果得到的結果會是module裡面的那個fly,因為會先去找自己的class有沒有fly然後再去找module然後再去找老爸 最後那一行可以看到尋找的順序,Flyable比Animal還要前面

p Cat.ancestors
 => [Cat, Flyable, Animal, Object, Kernel, BasicObject]

http://skilldrick.co.uk/2011/08/understanding-the-ruby-object-model/ 然後可以看一下ruby object model,會發現大家感情真的很好(?!) 除了module的Flyable以外大家的class都是class呢(我在說什麼),然後因為class是繼承至module,module的superclass是Object,所以又萬佛朝宗 就變成上面網站裡面那滿滿箭頭連來連去的圖了

2.3.3 :037 > Cat.class
 => Class
2.3.3 :038 > Flyable.class
 => Module
2.3.3 :039 > Animal.class
 => Class
2.3.3 :040 > Object.class
 => Class
2.3.3 :041 > BasicObject.class
 => Class

source_location

可以幫大家找出原始檔案的mehtod,連在第幾行都會一起告訴你,貼心。

2.3.3 :001 > 3.method(:days).source_location
 => ["/Users/telsa/.rvm/gems/ruby-2.3.3/gems/activesupport-5.0.2/lib/active_support/core_ext/numeric/time.rb", 45]

不過ruby內建的method就不適用了


##migration .......其實我一開始很常因為各種我現在想不起來的理由炸了migration(遠目) 現在好像偶爾也還是會沒用好orz 那先講一下如果反悔了該怎麼辦 ###rails db:rollback 就個是當作剛剛什麼事都沒有發生的方法,一切都是幻覺嚇不倒我的。 如果你剛剛是create_table,他就把你給drop 新增欄位的話就把它刪了,總之都是幫你做相反的動作 不過不太推薦這樣子做 還是乖乖新增一個新的migration檔案收拾剛剛的殘局吧 http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

然後很重要的,要存檔要存檔要存檔要存檔要存檔要存檔要存檔 如果你檔案沒存就執行rails db:migrate 他還是會執行下去,只是什麼事都不會發生,但問題是每一個migration檔案都只會執行一次,等你之後發現“咦?原來我剛剛沒存檔?”想說存了之後了不起我在執行一次總行了吧~ 但天不從人願,他不會理你.....................,因為只會執行一次

migration雖然可以保證大家的schema都長得一樣,外加可以讓大家知道當初誰做了什麼事以及就算換資料庫也不至於想撞牆很方便,但是當migration的檔案數量一多,再加上各種歷史共業,他是有可能跑不完的,這時候可以用 rails db:schema:load 他會直接load schema.rb,這樣子你還是可以建立成功


gem

gem install xxx gem "xxx" 這兩個差在哪呢? 其實就是下面那個會去更新gemfile而已,本質上都是把gem安裝到電腦裡 但是加到gemfile裡面的話可以方便你一次安裝這個project需要的所有gem, 所以大部分的時候這樣子比較方便

view raw ruby.md hosted with ❤ by GitHub

沒有留言:

張貼留言