掌握Ruby世界就要先懂:類別 Class
上一篇文章簡單介紹物件導向 (OOP) 的設計模式,也稍微開個頭提到 Ruby 中的物件部分,有提到這句話:「Ruby 中的物件(Object)是一個類別(Class)所製造出來的實體(Instance)。」,也舉了例子表示物件由類別所產生出來。可以把類別想像成模具,而物件就是透過模具所刻印出來的實體。今天就來好好說明這個例子要表達的概念是甚麼,而類別又是甚麼吧。
類別 Class類別中可以放置很多方法跟屬性,大家應該從前面對於物件導向的介紹中有看到,這些都寫在類別中。開始寫 rails 之後更是會注意到 Model 及 Controller 都是由 class 構築而成,且繼承自更上層的類別,這部分後面進入到 rails 的介紹會再有更多的說明。
定義類別慣例上來說 class 會以大駝峰的方式來命名(CamelCase),例如 SayHello、PostsController、User。
123class 類別的名字 #...end
12345678910111213141516class Human def eat(food) puts "#{ ...
掌握Ruby世界就要先懂:物件導向
相信大家學習程式的道路上應該會多多少少都會碰到物件導向這個專有名詞,Ruby 這個語言也具有這樣的特性,今天就先為大家來簡單說明一下這個概念吧!!
物件導向基本概念、物件導向主要裡面包含了 4 大主要概念,抽象化、封裝、繼承、多型
抽象化(Abstraction):
把真實世界的事物,轉化成物件的概念。把物件相關的資料抽取出來,定義成為物件的屬性(attributes) 以及方法 (methods)。
想像成你要創造一個電腦物件,他具有可以記錄筆記、上網、玩遊戲等等的功能,把這樣的概念轉化成程式碼中,就是所謂的抽象化。可能可以用更具體的軟體功能舉例,你設計使用者,他有帳號密碼,可以建立文章、設定頭貼、加好友….等等,這一串分析你身旁某個東西的特性或外觀時,就是抽象化的動作。
封裝(Encapsulation):
封裝就是要讓使用者可以使用這個物件,但不讓使用者知道內部的邏輯。
在 Ruby 可以對變數及方法來進行封裝:
封裝變數:實體變數(@variable)及類別變數(@@viable)就是封裝在類別內部,類別外部是無法使用。
封裝方法:像是 private 或是 prot ...
Rails 套件操作指南,Devise (helper使用、新增欄位及驗證、i18n)
基本會員註冊登入沒問題後,剛開始大家可能會想先處理的,就是註冊的一些欄位新增與資料要寫入資料庫會碰到問題,以及個別通知訊息及標籤的 i18n 中文化等等,所以本篇會簡單提到關於 i18n 這個套件搭配 Devise 的用法
產生 controller套件有指令可以幫忙生出對應的 controller,如果前面建立的 model 是 User 且也是放在 devise 之下,用以下的指令並且 [scope] 改為 users,可以產生對應的 controller,每個 controller 內容有許多註解為提示這些 controller 是對應那些功能相關
1rails g devise:controllers [scope]
也可以針對特定目標產生相關的 controller
1rails generate devise:controllers [scope] -c=[controller's name]
注意有提示訊息提醒要確認在 routes.rb 中設定正確路徑
123# 如果同上用 rails g devise:controllers user# 想要用 ...
Rails 套件操作,Devise (安裝及基本設置)
進入 ruby 世界之後,無非就是希望可以使用 rails 框架來幫助你達到快速及 RESTful 的開發方式,在 rails 世界其實擁有許多強力的裝備,可以幫你擊退沿路的困難,就是我們所謂的套件 (packages)。
想當初學習自製登入系統真的有點辛苦呢,但 rails 中其實有厲害套件 Devise 可以幫你完成喔,但要能客製化出自己想要的東西也不是很容易的事情呢! 就先來針對基本的使用及客製方式好好來了解一下吧。
Devise 可以做什麼?rubygems 介紹這是一個很強大的會員系統建置套件,你可以看到下載次數破億就知道這套間多熱門了吧。大部分會用到的就是基本的會員資料建立,他可以幫你做好資料庫密碼的加密 (salting),多數會拿來用的就是進行註冊登入的認證,讓一些區域透過認證的方法判斷是否有登入,限制特定功能的使用。其實可以用到的功能非常非常多,可以進到 github 看官方手冊介紹。
主要會用到的功能:
註冊/登入
第三方登入註冊串接
註冊登入驗證
忘記密碼、修改密碼
密碼改動及會員認證信
安裝
原始 Devise github
放到 gemf ...
掌握Ruby世界就要先懂:區塊
在 Ruby 世界中有著區塊(本篇將稱 block)的特殊語法,跟語言的執行程序上有大大的關聯,今天就來好好跟大家介紹這些部分吧!
區塊 Block前面有跟大家說到 ruby 幾乎甚麼都是物件,但唯獨 block 這個東西他不能算是物件,而block 在 ruby 中有兩種:
{} 之內
do…end 的範圍內
Block 的特性總結有以下的特性:
一段不會被主動執行的程式碼
不是物件
像寄生蟲一樣需要依附在某些方法或物件,且不是參數Block 會不會執行,要看宿主臉色,是否有 yield
可以看下面的例子,我們定義一個吃東西的方法,food 是參數,下面的兩種 block 類型其實都不會被執行,既使看起來有被呼叫到,就像我們上面說的特性,不會被主動執行,也不是參數。
123456789101112def eat_something(food) # eat something hereendeat_something(rice) { puts "Block在這"}# 或是 do ... end 寫法eat_somethin ...
掌握Ruby世界就要先懂:方法
這部分的觀念相當重要喔,大家使用 ruby 主要為了可以好好操作 rails 這個開發框架,裡面內部組成,除了前面的資料類型及邏輯判斷等,再來務必要認識的就是這些方法(Method)跟區塊(Block)的使用了。有一定的認識後進入 rails 的世界才能看懂其中的奧妙呀!
方法 (Method)為什麼要使用?有些時候我們會重複做一些指令,如果可以簡單幾行字就能呼叫一連串的指令,然後可以重複利用在不同的地方,就是我們為什麼會要使用方法的原因啦。
如何定義與使用?如同標題我們要定義就是使用 define 這個英文的簡寫 def 來開頭,後面宣告這個方法的名稱,名稱很重要最好可以清楚表達執行內容,接著就是放入的參數及要執行的內容,最後再加上 end 結束,後面會介紹到這段def...end的範圍稱為區塊,大概會長成這樣:
123456def say_hello() # 方法名為say_hello,後面括號可以不放參數 puts "hello"endsay_hello() # 印出 hellosay_hello # 同上,可以省略括號
參數(parameter)與引 ...
掌握Ruby世界就要先懂:迴圈與迭代
迴圈與迭代 Loop amd Iteration這部分通常都是每個程式新手剛開始碰到的一個小難關,常常自己卡在迴圈裡面轉啊轉轉不出來,究竟我們為什麼會需要迴圈呢? 今天就來好好介紹一下這個好東西吧!
為甚麼會需要迴圈?我想答案其實很簡單,因為重覆阿,主要因為在程式設計的資料呈現或是取得上,特別是陣列,會不斷透過相同的指令去重覆進行,所以就有了迴圈這樣的方法產生了。比如說要你依序取出特定的資料或是印出一些字串,你應該很懶得自己一樣樣的取出或印出吧,如果一個指令就能自動全部拿到或是幫你重覆執行相同動作的話,何樂而不為呢?
迴圈種類在 Ruby 裡面的迴圈主要有以下五種:
for
while
loop
method (Ruby 特有)
迭代 (常用)
迴圈和迭代 Loop vs Iteration很多時候這兩個類型定義其實很模糊,主要差別是:
迴圈: 執行完特定圈數就沒了
迭代: 是要針對每個對象去進行(或遍歷),也是一種迴圈的方式,會執行到每個對象都完成後才會停止。
For 迴圈 (for…in)for in 迴圈使用的格式通常是 For 單數名 in 複數名通常這兩者之間 ...
怎麼大家都一直在說 REST 和 RESTful?
怎麼大家都一直在說 REST 和 RESTful?關於這兩個名詞的好奇,其實是因為接觸 ruby on rails 的學習歷程中,查詢相關的職缺資訊後,發現許多公司的需求不斷提到這兩個字,因此想要去了解這是在說甚麼,才知道原來 ROR 把這樣的設計風格大大發揚光大呢! 不過都學了 Rails 還不好好把這些名詞弄懂真的太對不起了。
REST?Representational State Transfer,簡稱 REST,直譯為”表徵化狀態轉變”,但一聽到這樣的名詞其實根本搞不懂這到底在說甚麼。
簡單地說 REST 是一種軟體架構風格 ,適合應用在複雜的網路服務環境中,而 HTTP 也是符合 REST 的架構的一項實作。目的是針對不同軟體、程式在網際網路中能夠互相傳遞訊息。每一個網頁都可視為一個資源(resource)提供使用者使用,而你可以透過 URL(Uniform Resource Locator),也就是這些資源的地址,對這些資源透過 HTTP 動詞,來讀取這些資源或是修改。
RESTful-Triangle (REST 金三角) 概念:
EX:以我們平常上網的例子來說明 ...
掌握Ruby世界就要先懂:邏輯判斷與流程控制
邏輯判斷與流程控制不知道各位有沒有看過這則笑話,你看完今天的內容應該就可以了解這個笑點在哪裡了!
這部分是各家程式語言最常使用也是訓練大家邏輯思考的地方了,許多的運算或是流程進行就必須先懂這部分的操作,今天就讓我們來好好認識 Ruby 的寫法吧!
等號的數量跟判斷有甚麼關係?
“=” 1 個等號是指定
“==” 2 個表示比對,會得到 true or false
“>=” 大於等於
“<=” 小於等於
“!=” 驚嘆號出現就是否定,不等於
其實 Ruby 的等號很多時候不是等號!!Ruby 裡面只有 nil 跟 false 是假的,其他都是真
If 條件判斷 (如果…不然就)if 是我們條件的設定,後面可以透過 elsif 添加額外得條件,或是 else 直接設定前面的條件之外的條件都算
注意: ruby 比較特別的是 elsif 不用寫”e”(英文應為 else if)。
注意:if 條件最後面需要加上 end 來表示這個邏輯判斷 block 的結束喔,後續的章節還會特別提到 block,可以先想像成這個 ...
到Ruby世界不可不認識:範圍
範圍 Range範圍是最先讓我感受到 Ruby 神奇魔力的特殊用法,相比於其他的程式語言,這些範圍的用法真的讓一些運算上省事很多,今天就讓我們來認識一下這個特別的魔法吧!
表示方法 “..” “…”範圍顧名思義就是表示一段區間的表示法,在 ruby 可以用 “..” 或 “…” 的方式來表示如 1-10 我們可以用 1..10,但記得要依序印出來不可以直接就用 p 直接印出 1..10,這樣可是會只有印出”1..10”,需要先轉成陣列,所以可以搭配 to_a 方法將範圍表示的東西轉成陣列。
如果不想用 to_a 轉成陣列,還有特別的 * 可以把範圍展開,配合陣列的[ ]放在內部,也有相同的效果
注意 .. 和 … 表示的範圍不同喔,..表示頭尾都包含,…不包含尾巴小小口訣:多一點少一點,少一點多一點
1234567# 少一點多一點 (包含頭尾)puts (1..10).to_a # 印出 1 ~ 10# 多一點少一點 (不含尾)puts (1...10).to_a # 印出 1 ~ 9# * 可以展開範圍p *1..10 # 依序印出1~10p [*1..10] # 印出 [1,2 ...