Productive Ruby on Rails
這陣子一直忙於專案.
之前的專案沒有使用Restful,於是寫起來有點辛苦,也不好整理.
這個專案一開始便使用Restful,配合Scaffold寫起來真的很快....
雖然,這是眾所皆知的東西了,但還是想紀錄一下.. :$
這是寫在Facebook上的文章,懶得重翻,將就一下囉.
英文不好請見諒. :p
I know why everybody say Ruby on Rails is productive now.
As most of parts, Ruby on Rails is there for you.
The only thing you need to do is just type some command and change some works.
For example. "Scaffold" is one of great tool that generate ready to go model for you.
In the one going project ,I scaffolded 4 times for all CRUD works.
Each scaffold for one set of CRUD, and it's ready with Restful style.
Only thing you need to do is build views and setting up some routes, some relationship between databases, and do a little bit work for your controller.
If you don't know what is Restful, and tried to understand how does scaffold works, it might drive you crazy.
Official docs guide you in pretty clear way : This
As others like iHower's PPT : This
And this : This
They all provide lots of information.
How easy if you go with Restful?
Sometimes,we want to create some relationship in this way : " find A user's POST "
In old way, you might create another action called "search post", and have lots of conditions in.
Maybe "find POST by user name", "find POST by comment".... as you can image, that will be lots of work to do.
In Restful way. you only need to set up relationship in routes like :
map.resources :users, :has_many=>{:posts,:comments}
then go into your each controller action "index" and add something like :
@post=find(:all,:conditions=>["user_id=?",params[:user_id]]) if params[:user_id]!=nil
then, when you type address like " users/1/posts/ " , it will show all posts by user_id 1 for u.
Cool, isn't it?
If you have further question, welcome discuss with me.
Heroku is a great host for RoR. But still has some problems
Heroku的簡便,其實也造就了他的問題.
因為不是第一次被人推薦了,所以就去官網上看看.
不過,看了就覺得並不是太想用.
除了價格昂貴,再來就是他的優點,其實也是缺點.
Heroku的優點是兩面刃
由於你只要註冊好Heroku,然後 :
sudo gem install heroku
heroku create yourapp
當你要建好專案要上傳 :
git push heroku
就上傳好了
當要做些工作,比如migrate :
heroku domains:add yourdomain.com #(加網域名,應該是加到DNS?) heroku rake db:migrate heroku bundles:capture
可是,他的方便也是不便.
我是不太喜歡一直和Host方溝通,比較喜歡一次就擁有很多自主權.
所以,當有問題,我該寫信去???
問題1, 如果想增加sub domain? 更改MX records,CName,etc...?
問題2, 原先配置為Thin+Nginx. 若想改用其他?
問題3, 目前尚未支援Custom SSL.
問題4, 太貴....
問題5, 還沒想到. 如果你有解答,歡迎討論互動.
就像Xdite說的,在我看來,現在還是Project比較適合. 若要Production,太貴,也不太適合.
--後記 :
初碰Heroku可能面臨問題.
Q : Install?
A : $>sudo gem install heroku
Q : Create?
A : $>git init
$>heroku create
Q : Upload?
A : $>git push heroku YouBranchName(master)
Q : See?
A : $>heroku open
Q : No ssh public key found in /root/.ssh/id_[rd]sa.pub. You may want to specify the full path to the keyfile.
A : ssh-keygen -t rsa
Q : Move Database?
A : $>sudo gem install taps
$>heroku db:push
Q : Rename App?
A : $>git remote rm heroku
$>git remote add git@heroku.com:YOURAPPNAME.git
Q : Manage Custom Gems?
A : 1. Create a file ".gems" under folder
2. Add "yourgem --version x.x.x --source xxxxxxxx" (ex : geokit --version '>=1.5.0' )
Each Gem one line.
3. "git commit -a" & "git push heroku xxx"
Textmate on Ubuntu9.04 - Gedit
寫Ruby, RoR的工具首推Textmate是毋庸置疑.
在Ubuntu上並沒有Textmate,但有替代方案 : Gedit (TextEditor).
Gedit是內建的, 如果你是9.04版本. 那麼更不需要安裝甚麼太多外掛.
其他的還有Theme,讓你的配色更好看.
還有自己遇到的一些問題. 希望有幫助.
Gedit Plugins
這些是網路上建議的外掛 :
Snippets - 點我下載 (9.04內建)
File Browser - 點我下載 (9.04內建)
Class Browser - 點我下載
Quick Highlight Mode - 點我下載
Word completion - 點我下載
Snap Open - 點我下載
下載完&解壓縮以後,在9.04下,全都丟到 /usr/lib/gedit-2/plugins 即可.
或是可以丟在某個資料夾內,然後開Gedit. Edit > Preferences > Font & Colors > Add
然後選你的檔案一個個加入.
一些讓你的Gedit看起來像Textmate的 Theme :
官方來源 :

下載DarkMate
(官方圖好像也掛了?)
下載Desert
(Gedit官方圖片掛了,有人有圖片煩傳給我,或告知. 感謝.)
下載Textmate
另外還有五個一組的Theme包. 下載請點我
分別有 :
Cobalt

Darkmacs

IDLE

Slush and Poppies

Twilight

其他來源 :

下載Tinge
如果還不夠,這裡還有更多. (部份重複)
Download them from GitHub
Gedit Highlight
再來就是設定一些ror檔案的highlight支援.
直接copy,然後貼在console下.
wget http://grigio.org/files/x-rhtml.xml; sudo mv x-rhtml.xml /usr/share/mime/packages
wget http://grigio.org/files/rhtml.lang; sudo mv rhtml.lang /usr/share/gtksourceview-1.0/language-specs/
惱人的RoR檔案Highlight問題
在安裝的過程中我自己遇到一個問題,就是erb顯示不正確.
你可以透過下列操作來修正.erb的highlight問題.
Console下輸入
sudo nano /usr/share/gtksourceview-2.0/language-specs/ruby.lang
找到
<property name="globs">*.rb</property>
修改成
<property name="globs">*.rb;*.rake;*.rjs</property>
然後存檔離開.
再輸入
sudo nano /usr/share/gtksourceview-2.0/language-specs/html.lang
找到
<property name="globs">*..html;*.htm</property>
修改成
<property name="globs">*.html;*.htm;*.erb;*.rhtml</property>
存檔離開.
再開啟Gedit,就應該顯示正常了.
--參考資料 :
http://rorblog.techcfl.com/2008/04/19/erb-syntax-highlighting-in-gedit/
把Gedit打造為Linux下的Textmate
Textmate-like Gedit in few steps
HOWTO: add support for .rhtml, .html.erb, .rjs, .rxml, .builder
Textmate 官方首頁
Rails on Ubuntu 9.04 Installtion
由於在Ubuntu下安裝Rails是一件有點煩的事,還要ln, 而且有時候有lib相依問題.
不是單純 apt-get install ruby rails 就可以.
所以就把自己安裝的經驗寫下來,下次自己安裝方便,而也可以分享.
打開Console輸入,這樣安裝包含了 Ruby, IRB, RdoC, Mysql, Sqlite, Sqlite3, 以及Libs , Dev
sudo apt-get install ruby irb rdoc libopenssl-ruby mysql-server sqlite3 sqlite libsqlite3-ruby libsqlite-ruby libmysql-ruby ruby1.8-dev
到官方下載 Rails Gem 這篇文章時,Gem為1.3.5版,點我下載1.3.5.tgz.
將之解壓縮並在Console cd到資料夾下
ruby setup.rb
再修正9.04下的安裝路徑連結錯誤
ln /usr/bin/gem1.8 /usr/bin/gem
安裝Rails
gem install rails
安裝Rake 及 Mongrel
sudo apt-get install rake mongrel
打完收工,Done!!
完成之後,可以再參考這篇Textmate on Ubuntu - Gedit
更多的Google map on Rails plugins,以及Rails Gis Hacks.
睡前偶然看到這帖.
裡面寫非了蠻多在Rails上實做gmap的plugin.
除了Geokit+YM4R 還又其他 :
像acts_as_geocodable , actsaslocateable .
不過看一看還是geokit比較好,至於YM4R... 我還是想自己寫...
這裡有一本寫關於gmap實作的,偶然間看到的
Rails底下如何使用Geokit+Google Map
最近因為專案需要使用GoogleMap整合,所以查了一下相關的文章.
多數在Rails實作GoogleMap是使用 Geokit + YM4R
然而用了一下YM4R感覺綁太死了. 所以我便開始研究GmapAPI
要使用Gmap,除了要有一定的Javascript功力,還得有一個必備的 : Geokit.
由於Gmap是丟座標給他顯示查尋,所以所有地址都得先用Geokit算出座標.
在這裡有寫到關於Geokit的一些東西.
我則是直接使用Andre的Geokit
你可以直接下指令來安裝 :
依照官方說法 :
script/plugin install git://github.com/andre/geokit-rails.git config.gem "geokit" #請打在environment.rb內 rake gems:install
最好再裝個 : sudo gem install geokit
但是我安裝完成後,Irb底下可以使用,但Rails project內一直不能使用.
不管include 或require. 但是怎麼抓就是傳回nil的Hash.
若有跟我遇上一樣的狀況不妨試試把 config>initializer底下的geokit文件 砍了.
然後在environment.rb加上(或更改) : config.gem "andre-geokit", :lib => 'geokit', :source => "http://gems.github.com"
這樣應該就能運作.
運作正常後,就可以在需要的Controller內使用啦.
記得先 include Geokit::Geocoders
然後可以試試以下的Code :
#Controller下
@a=Geokit::Geocoders::YahooGeocoder.geocode '140 Market St, San Francisco, CA'
@b=Geokit::Geocoders::YahooGeocoder.geocode '789 Geary St, San Francisco, CA'
@distance=@a.distance_to(@b)
@heading=@a.heading_to(@b)
@midpoint=@a.midpoint_to(@b)
@endpoint=@midpoint.endpoint(90,10)
#View下 <=@a.ll> <=@b.ll> <=@distance> <=@heading> <=@midpoint> <=@endpoint>
(不曉得為什麼用< %% >會不行, 請先暫時自動加%上去. 感謝)
如果正常,那麼代表你的Geokit是正常.
如果要看更多範例可以到 Git Geokit 這裡是討論群
正常之後就可以把座標一個個丟給Google Map啦.
至於Google Map則是Javascript,會再開一篇文章討論Google Map.這篇,就先這樣吧.
Rails的Find SQL語法在多變情況下.
前陣子寫內部簡單的Search Engine,面對SQL其實突然有點失措.
在Rails底下,sql通常是下指令如
Find, Find_by.
傳統的是 Obj.find(:all,:conditions=>["sql command",vara ,varb ,varc])
然而有時要做進階的判斷,依據狀況可能有不同的參數&Conditions,又不想單純的find_by_sql.
如何改變conditions指令呢?
fcon=[''] fcon[0]="a like ? and b like ? and c like ?" fcon << params[:a] fcon << params[:b] fcon << params[:c] fcon[0]="d like ? and e like ? and f like ?" fcon << params[:d] fcon << params[:e] fcon << params[:f] Obj.find(:all,:condition=>fcon)
如此一來就不用find_by_sql,又可以達成conditions的變化.
協同開發之-Git 與 Trac.
由於開始得與人協同開發,但對方並不黯程式語言,所以開始尋找一些較好的協同開發方式.
爬文一整天架設了Git與Trac.
卻發現雖然解決了協同平台,在版本上衝突的可能性,卻仍解決不了必須下指令這個窘境.
截至目前為止,Git最好地就是使用指令去操作.
雖然Mac上有GitX. 而Linux上使用到的是SmartGit.
但這個Git也只是面對版本上的協同,在多數的情況下,開發者本身仍是需要在自己的電腦上具備server(ex mongrel,passenger)
若另一方不會安裝or使用server(比如下指令 ruby script/server).
那麼協同開發也無能為力.
為此,決定幫共同開發者安裝ruby on rails 環境.
回到正題,在研究版本控制的方式,約略會爬出以下幾個重點 :
主要 : CVS , Subversion , Git . ( Open source )
其他 : Bitkeeper , Visual SourceSafe ( Commercial )
以時間排序, CVS為1992, Subversion為2002, Git 為近期新的狠角色.
若你使用RoR+Subversion. Vlad 或 Capistrano 可以搭配.
Vlad較為簡便快速,雖然兩個我都沒裝過.
而RoR+Git應該就是主流了.
關於Git的介紹網路非常多 :
如這裡
這裡
這裡
而原文資料就更多了.
可以參考 :
官網
Wiki
或搜尋 " introduce git " 或 "git "
Trac是一套便於視覺管理Git的好物.
由於Trac是用python開發,安裝之前需有python以及easy_install.
easy_install可到 這下載. 先 python -version你的版本. 再下載對應的egg
然後開console到該檔案的位置 sudo sh 檔名.egg
再 sudo easy_install Trac即可.
關於Trac 的安裝及調校請參考 : 我
以上. 筆記.


