以下是筆者今天於Ruby Tuesday社群聚會分享使用Ruby on Rails開發Facebook應用程式的經驗之投影片。裡面包括許多實際在使用中的程式碼並且都有提供Gist的網址,有需要的朋友可以直接到該網址複製使用。
其中有提到iPK這個Facebook應用程式,是筆者參與Inside部落格團隊所開發的應用案例,投影片中所有的程式碼片段皆整理自該程式,若您對於程式的寫法有任何建議或疑問,歡迎在本文提出以進行交流、討論。:)
投影片內容除了團隊共同的研究、開發經驗之外,也感謝Cardinal Blue經驗上的分享,關於Cardinal Blue分享的投影片請見:Cardinal Blue的Facebook應用程式開發經驗分享:使用Ruby on Rails與Heroku
Posted by (0) Comment
今天試著將兩個手頭上已經沒在密集維護但偶有流量的網站移植到Heroku上來降低維護的成本,過程中相當輕鬆地將專案無痛轉移到Heroku之外,連資料都一起順利轉移過去了,以下是轉移步驟的簡介。
步驟其實很簡單,官方文件上應該也能找到更詳盡的教學,另外要注意的是,如果您的專案擁有自己的網址,希望能一併指到Heroku,還需要注意下列事項:
當然,上述步驟可以不透過指令,直接在Heroku的管理介面完成。
我自己在移植的過程中遇到兩個問題,第一個是資料丟上Heroku之後都變成亂碼,但我的MySQL編碼就是UTF8了,實在沒道理,因此就嘗試加上$KCODE的設定,沒想到馬上管用。
第二個問題是資料如何丟到Heroku,步驟也很簡單:
其中要注意的是,Heroku設計的原意是讓你可以將開發過程中已有的測試資料(development環境)丟上Heroku一併測試,因此我目前沒有找到如何讀取production環境的參數,我自己的作法是在config/database.yml中將development的設定改為production的設定,讓程式去讀取production。
或是你也可以使用指令的方式指定任意的資料庫:heroku db:push mysql://YOUR_USER_NAME:YOUR_PASSWORD@localhost/DB_NAME
P.S. 當然,如果嫌Heroku不好用或是其他原因想要搬家,只要下heroku db:pull,就會把雲端上的資料撈回來放在development環境,我自己是用SQLite,資料就會倒進SQLite了,是不是很方便呢?:p
Posted by (0) Comment
我曾寫過一篇「Rails: 建立Permalink,避免流水號洩漏網站資料」針對有人擔心(或質疑)Ruby on Rails中以資料表主鍵流水號作為URL中的參數,會導致網站洩漏某些不希望被外界一眼看穿的資訊,例如使用者總數或文章總數之類的數據,因此簡單地透過Model在存取資料庫時的before_create方法建立每一筆資料的unique key來避免這個問題。
之前使用Rails 1.2.x版本時根據我當時的作法並無不妥,因為我自己的coding習慣是會完整地指定controller, action以及id,並在對應的action中使用find_by_key的方法來找到資料。
然而,升級到Rails 2.0後便會出現許多麻煩,例如預設產生的scaffold必須修改許多地方,才能讓Model.find_by_key、redirect_to post_url(@post)之類的方法正確運作。
於是我一直到前陣子才找到應該比較正規的作法:在Model中使用to_param方法。
to_param(): Enables Active Record objects to be used as URL parameters in Action Pack automatically.
這麼好用的方法我居然不是一開始就發現,只能說相見恨晚,好險我開發Rails 2.0的時間還不算長,沒走到太多冤枉路。要實踐本標題所說的在Rails 2.0中如何避免在URL使用資料流水號便相當簡單!
1. 建立Scaffold:(通常會對key這個欄位建立index並設定字串長度limit,別忘了:p)
script/generate post title:string content:text key:string
2. 將Post的migration寫進資料庫後修改Post model如下:
class Post < ActiveRecord::Base
before_create :generate_key
def self.find(*args)
if args.first.is_a?(String)
find_by_key(args.shift, *args) or raise ActiveRecord::RecordNotFound
else
super
end
end
def to_param
key
end
protected
# 我前一篇文章產生key的方式不太一樣,這應該是個人習慣。
# 另外,其實亂碼的網址沒有SEO的效益,建議還是弄個slug吧!
def generate_key
require 'digest/sha1'
self.key = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )[15..24]
end
end
就這樣!概念很簡單,就是不再用ID當查詢的參數,全面改用key啦!關鍵就在於使用to_param()方法以及對find做進一步的判斷,因為我除了Model.find(:all)之類的Symbol,其餘的CRUD都是傳入Key作為參數,因此在此僅簡單地判斷是否為字串。
如此一來,不管你是什麼user_posts_url, new_user_post_url都可以輕鬆地直接以ActiveRecord Object傳遞,起碼我之前曾經嘗試用edit_post_url(@post.key)這種方式傳值,非常麻煩、要改Controller又要改View,現在用了to_param(),什麼都不用改了!又優雅又簡單,寫起來更加快樂、效率也提昇了:p
P.S. 其實在Rails 1.2.x應該也是這麼做比較優雅,不限於2.0
Posted by (1) Comment
HTTP的規範中,狀態代碼301代表Permanent Redirect(永久定址轉移)、302則是暫時定址轉移,相較於使用HTML或是JavaScript來達到Redirect轉址目的,最大的差別在於301/302的HTTP狀態是被搜尋引擎所認可的;換句話說,你可以透過301/302轉址的方式讓搜尋引擎爬到你搬家後的新網頁。
至於301、302兩種狀態的差異,所謂的「永久」定址轉移是指搜尋引擎會根據你所指定的新網址重新建立索引,原來的位址便不再使用;而暫時定址轉移則是暫時性地將網頁搬到某個地方。
一般做301/302轉址可直接更改.htaccess檔案,讓Apache代勞即可:
Redirect 301 /not_available/old_page.html http://www.newserver.com/available/new_page.html
若要在Rails中來做這件事情,有幾種作法,最簡單的是在Controller裡面寫
headers["Status"] = "301 Moved Permanently"
redirect_to http://somenewurl/
或者
head :moved_permanently, :location => 'http://somenewurl'
或者,從Rails的原始碼中可以看到下列用法,感覺這個最好用:p
(from trunk/actionpack/lib/action_controller/base.rb)
# Examples:
# redirect_to :action=>'atom', :status=>:moved_permanently
# redirect_to post_url(@post), :status=>301
# redirect_to :action=>'atom', :status=>302
Posted by (1) Comment
前陣子看到Ruby on Rails的開發團隊捨SVN改用Git作版本控制系統,並且改用Lighthouse作為Issue Tracking System,今天心血來潮便在Windows Vista上把Git的環境建置了一下,並且使用Github作為Git repository hosting。嘗試Git的原因很簡單,一來是我喜歡新鮮、再來是看了Github的介面挺清爽的,就玩看看:p如果你對於Git跟Svn的差異有興趣可以看看這篇文章。
在Windows上安裝很簡單,Git官方網站上有列出Linux、Windows以及MacOS專用的版本,我下載的是msysGit 1.5.5 Preview的版本,過程中唯一比較特別的是下列畫面:
你可以選擇使用Git內建的Bash或是Windows本身的Console,我是選擇第一個,因為我擔心混在一起不但做不出撒尿牛丸還有可能讓系統爛掉,所以還是讓兩個命令列模式各自為政吧!若習慣cygwin的人,應該也是能在cygwin底下使用的。
第一次執行Git Bash的畫面如下:
在這個console底下,常用的Linux bash指令應該都可以用,tab auto-complete也能用,還算挺方便的。
我是選擇Github來作為Repository的所在(目前也沒注意是否有其他選擇),我先上Github申請了一個帳號之後,開啟Github進行幾個簡單的步驟。
剩下的我想應該都很簡單,只要從Github的首頁建立新的Repo.,有經驗的或是想開始學版本控制的朋友應該都能照著上面的指示完成建立Repo.的動作:D