by winson, 3 months ago.
當您在程式中提供小人頭圖像上傳功能時,搭配Vlad the Deployer八成會出問題,因為Vlad the Deployer會從SVN下載新的版本,並把舊版本整個換掉,亦即使用者的個人圖像統統會消失。
為解決這問題,我們可以善用Vlad the Deployer的語法,首先要做的就是把原先上傳到Rails public目錄的圖檔整個搬移到Web server的目錄下:
mv /your_rails_app/public/user /var/www/user
接著修改該目錄的權限:
sudo chmod -R mongrel:mongrel /var/www/user
於是,我們可以在Vlad the Deployer的設定檔中,增加一個新的Remote task,負責幾件事情:
- 砍掉空的圖像目錄
- 做symbolic link連到/var/www/user
請在您的deploy.rb檔案中,加入以下語法:
namespace :vlad do
def sudo(command)
run [sudo_cmd, sudo_flags, command].join(' ')
end
desc "Setup user photos."
remote_task :setup_photo do
user_path = "#{current_path}/public/user"
sudo "rm -r #{user_path}"
sudo "ln -s /var/www/user #{user_path}"
end
end
這個setup_photo要做的就是,每當遠端程式更新完畢之後,處理一些圖檔目錄相關的動作,於是往後更新版本,都可以保留使用者上傳的所有個人圖像。
by winson, 3 months ago.
把開發團隊的程式碼庫與Twitter訊息中心結合在一起該有多好?新推出的幾個Subversion hosting服務幾乎都有這種整合功能,例如Versionshelf,如此一來可以讓開發團隊成員直接訂閱Twitter即得知最近程式庫有哪些變更。這種做法相當有趣而且簡單:
1. 要擁有一個Subversion repository。
2. 要申請一個Twitter帳號,供團隊成員訂閱。
3. Subversion所在的伺服器必須可以跑curl,我們要利用Twitter的API來送出commit訊息。
by winson, 4 months ago.
Vlad the Deployer這玩意兒簡單又好用,就算有一百台主機分散在全世界,我想透過它來部署、更新系統也是輕而易舉。
但是在實務操作面,還是有幾個問題:
第一、它預設使用Apache,那麼頗受好評的輕量級網頁伺服器lighttpd怎麼辦呢?
第二、它預設執行環境為Production,那麼我要如何在Development環境下跑呢?
第三、每一台主機位址都不同,要在哪裡設定呢?
最簡單的方式是用namespace,如下:
namespace :macmini do
task :settings do
set :domain, "tw.myrails.com"
set :rails_env, "development"
set :web_command, "/etc/init.d/lighttpd"
end
setup_tasks
end
namespace :macpro do
task :settings do
set :domain, "us.myrails.com"
set :rails_env, "production"
end
setup_tasks
end
看到沒?上述三個疑問一下解決掉,包括不同主機位置、不同執行環境與不同的網頁伺服器!!
by winson, 6 months ago.
去年寫過隨機挑一筆資料的作法,現在看來其實還有很多可以改進之處。
一、直接寫成Something.random並不是很漂亮的作法,寫成Something.find :random才是符合Rails慣例的作法。
二、部份語法當時看起來簡單,現在則感覺累贅,牽扯到例外處理實在有點麻煩。但是,在實務上,我們也必須處理因為資料被刪除而跳號的情形。
by winson, 8 months ago.
善用return unless的技巧,可以在同一個頁面觸發動作:
def login
@page_title = 'What are you doing?'
return unless request.post?
user = User.find_by_login params[:user][:login]
redirect_to :action => 'home' if user.password == params[:user][:password]
end
view用一般的form_tag就可以了。判斷user是否已登入:
def logged_in?
session[:user]
end
請在application controller寫下這個action,那麼隨處都可以使用logged_in?來做條件判斷,前提是必須使用session。要知道目前登入的user是誰嗎?
by winson, 10 months ago.
我非常喜愛Revolution On Rails網站上一系列名為Code Digest的文章,內容主要由幾位程式員輪流貼上自己常用的、精巧的、方便的、簡潔的程式片段,並加以說明,我也來試著分享一下。
要問Revolution On Rails是什麼來頭?那就必須提一下Revolution Health。Revolution Health是前AOL創辦人Steve Case離開時代華納之後,另起爐灶,創辦的一家醫療、健康領域相關的網路公司。
這家網路公司採用Ruby On Rails技術,背後的開發團隊實力堅強,在Rails圈貢獻相當多的Plugin,例如這裡、這裡、還有這裡。
而他們所設立的部落格就是Revolution On Rails。
by winson, 11 months ago.
很早就想寫一下我是如何開發Rails程式的,說穿了只是運用一些小技巧讓整個開發過程更加愉快、方便而已。
1.活用目錄結構
Rails的架構設計非常有趣,整包系統就是一個目錄結構,其中包括建立資料庫的語法、測試案例、不同的執行環境以及眾多的外掛等。
一般寫Rails程式的起手式是這樣子的:
by winson, about 1 year ago.
Session在Railss中扮演非常重要的角色,例如購物車及帳號登入,這都是非常基本的東西,又因為在Rails上處理Session實在是簡單到不行,常常會有許多觀念錯誤之處。
有一種用法是在ApplicationController裡面預先寫好處理Session的程式碼,這樣在其他Controller裡頭就可以透過before_filter直接拿來用。
例如: http://pastie.textmate.org/58217
理論上不應該把整台購物車存到Session,但我暫時用#3,因為能夠1行完成的,就不弄成3, 4行。
處理Session要有幾個基本的觀念:
- 存進去的物件要盡量小,例如model的id多半是整數,那麼就很適合存入Session。
- 有空要去清。例如開發時,可以直接清tmp/sessions目錄下的暫存檔,或Session table;正式上線當然要寫batch去清。
- 記得寫expire的code。
- 不需要經過額外的Marshal處理。就算是檔案型Session系統也會自動處理並轉換,這一部份不需要額外用dump什麼的。
by winson, about 1 year ago.
有沒有想過為什麼Rails是建構在Ruby上,而不是其他的程式語言?
Ruby是由日本人松本幸弘在1995年所設計的物件導向程式語言。有人說Ruby介於SmallTalk跟Perl之間,但我不這麼認為,我認為Ruby在讓程式員快樂以及寫出漂亮程式碼這兩方面上遠遠超越其他的程式語言。
Rails企圖將Ruby的快樂以及生產力融合成頗具威力的網際網路應用架構。
這兩年PHP被Rails震暈之後,上頭也出現許多類似Rails的架構,最後只證明了一點: 這些架構還是比不上以Ruby為基礎的Rails那般快樂及具有生產力,更遑論其他專門給程式員找麻煩的程式語言了。
Rails很徹底地將Ruby的精神”讓程式員快樂(Make the programmer happy)”完完全全移植到Rails上。因為有快樂的程式員才有快樂的程式碼,最終才會產生最大的生產力。
by winson, about 1 year ago.
在Rails的rhtml中,link_to的作用是把資料庫的某一筆資料丟給別的action去處理。
例如: 網路書店的書籍清單畫面,可能是一個book_list action搭配view所展示的,裡面可能會有一個add_to_cart的購物車action,利用link_to可以把某一本書丟進購物車。
所以