[RoR] Passenger + Apache = 無敵金身

目前為了要把RoR和Apache做個整合,所以在網路上找尋可能的實作方式,找著找著,就找到Passenger這個Apache_mod,真是太好了,接下來就是來看一下要如何設定了。

文件參考

以下是用「MAC OSX 10.5.8」、「Apache2.2.13」當工作環境,如果有出入的話麻煩自行微調一下。

剛開始要先有Apache,這是理所當然的,不過原先在蘋果上面已經綁了一個Apache Server,而在Passenger 1.0.3以後有支援原生的Apache Server,因為照理說大家都已經有了,所以我們就直接跳過安裝Apache這一步吧。

接下來就是透過Gem裝一下我們的Passenger寶石。
http://gist.github.com/319448.js?file=gistfile1.sh
這邊我在裝的時候花了一些時間,可能要耐心等候一下,大概有幾分鐘。

再來就是讓Apache來建立這個Module
http://gist.github.com/319456.js?file=gistfile1.sh
等這個Module安裝成功後,就會得這個畫面:


截取重要的那一段訊息之後:
http://gist.github.com/319459.js?file=gistfile1.sh
現在我們就可以把這一段Apache的設定放入httpd.conf的設定檔。

不知道大家的設定檔位置是在哪,我的話是放在「/private/etc/apache2/httpd.conf」,

接下來就可以把剛剛的那一段設定寫在檔案的最後面,讓Apache會在啟動時去讀取那個模組,並自動設定好Passenger的位置和Ruby bin的位(這一段是因人而異的,所以通常每個人都不太一樣,要寫入自己安裝完Module時的那段設定)。

Good,基本的模組設定如果都成功的話就可以開始設定我們的Rails專案了。

BTW,如果Passenger發生了什麼問題的話,直接修改你的「httpd.conf」把那三行comment掉就可以停止載入Passenger了。對了忘記提醒一下,只要有「動到」Apache的任何一個設定檔,就一直要reload Apache哦,別傻傻的一直試,想說怎麼都沒有效果出來。

再來是Passenger的簡單應用,

因為原本在「httpd.conf」的最後面有寫入「Include /private/etc/apache2/other/*.conf」,所以我們就在other這個資料夾新增一個適用於自己專案的設定檔,這邊就叫他「test.conf」吧。(以下用VirtualHost來設定路徑)

然後因為我的專案是叫做「test」,所以我就在「test.conf」這樣設定:
http://gist.github.com/319469.js?file=gistfile1.txt
在這邊有幾點要注意的就是當你要部署一個專案的時候,一定要把「DocumentRoot」指到你的專案的「public」資料夾,而且要「Disable MultiViews」。

所以現在只要打「http://localhost」就可以看到我們的頁面囉。

再來要補充的是進階用法:如果我們不要直接Match我們的專案到該網域的話,那要怎麼做到Sub URI? (如http://localhost/test 可以指向到我們的test專案,而 http://localhost/ 可能就還是我們原先的Apache welcome頁面)

看官方的做法真的是很酷,要利用到Symbolic Link來部署我們的專案,超酷,那該怎麼做呢?來看一下我的設定檔。
http://gist.github.com/319474.js?file=gistfile1.txt
一步步解釋,因為用到Sybolic Link,所以如果我有很多種不同的專案時(如 /test , /abc , /def ),那我就會有很多個Link,所以先統一放在「/Users/EragonJ/links」這個資料夾內,接下來再把他們指向到你要的專案下的public資料夾,請看圖例:


Symbolic Link是這樣製作的「ln -s 被指向的位置 symbolic link的名字」,
http://gist.github.com/319483.js?file=gistfile1.sh
OK,設定好我們的Link後,再來就是要修改一下原先的conf檔(依照上面那個Gist的註解來做修改),那個RailsBaseURI就是我們「http://localhost/xxxx」的「xxxx」,也就是原本想要實作的Sub URI,只要透過Directory內的Symbolic Link 去幫我們指向到我們的「test/public」,就可以了。

以上是我在玩Passenger的一些小心得,如果有什麼錯誤的地方麻煩留言指正,而更進階的玩法就麻煩參照官網上的資料囉。

我們下次見。

[RoR] ActionMailer + Gmail +SMTP_tls = Amazing !

哦耶,今天一個下午在尋找和PHPmailer一樣的東西,讓我可以在RoR上面做到「註冊完自動回覆」的功能,中間參考了很多個站的教學,但是都一直實做不出來寄信的效果,就覺得很XX,結果皇天不負苦心人,我在一個國外的網站找到了實做方法也測試成功。

先註明一下環境:「Ruby 1.8.6」、「Rails 2.3.5」(後面有「Ruby 1.8.7」的做法)。

OK~GO,一開始先來去「ROOT/vendor/plugins/」,用下面這個指令把相關的資料抓回來,此時你的plugins下就會多出一個action_mailer_tls的資料夾了。
http://gist.github.com/306718.js?file=gistfile1.sh

再修改你的「ROOT/config/environment.rb」,把以下這段Code插在end之後,
http://gist.github.com/306694.js?file=gistfile1.rb

OK,大功告成,原本要用什麼sendmail還是什麼mail server才可以做到的事情現在單靠Gmail就可以做到,算是比較符合小型開發者的需求。那環境用好了,接下來就依官方教學設定自己的ActionMailer了。

一開始先產生我們的Model,
http://gist.github.com/306699.js?file=gistfile1.rb

好,原本的Model內容應該是空的,來加入一些我們的基本設定(官網的詳細介紹):
http://gist.github.com/306705.js?file=gistfile1.rb

現在Model做好了,要再為該Model下的Action做一個View(這邊很重要),我原本以為這個View可以不用做,結果我錯了,因為官方教學有寫到,這個就是信件的內容,所以如果你不產生這個View,就會出問題(之前就是敗在這),

在我的例子中,我的路徑是「ROOT/app/views/eat_me_mail/send_mail.html.erb」,這裡面就是你想寫的話啦,要寫什麼就隨便個人了,這邊就不多說明,最後就是和Controller合併起來。

這邊先引用一下官方的說明「You never instantiate your mailer class. Rather, your delivery instance methods are automatically wrapped in class methods that start with the word deliver_ followed by the name of the mailer method that you would like to deliver」,它的意思是說我們要在Method前面加上deliver_才能呼叫,在這大家就依自己的工作需求,呼叫自己的Method就可以傳送出去了,而下面是我的例子:
http://gist.github.com/306711.js?file=gistfile1.rb

到這邊,整個過程都已經結束了,如果你在讀取該Controller下的Action時有產生短暫延遲,就可以再去server看一下是不是有類似以下的訊息,如果都有的話,那就成功啦,耶斯!
http://gist.github.com/306715.js?file=gistfile1.txt

最後附上一張測試成功圖,我們下次見:D~


〈補充一下Ruby1.8.7的作法〉

因為工作上的關係,所以自己和伺服器的版本不同,所以在移植的時候出了很大的問題,雖然程式都沒有報錯,但是會發現信寄不出去,這真是一個很該死的問題,所以我又上網到處找資料,發現了原本的tls是給Ruby1.8.6版本用的,所以在1.8.7時就不能再用這個做法,所以要改用另外一個寶石。

http://gist.github.com/310748.js?file=gistfile1.sh

然後修改「ROOT/config/environment.rb」這個檔案的內容如下,
http://gist.github.com/310749.js?file=gistfile1.rb

OK,這樣就可以了,大概就是這樣啦:D~

[RoR] Rocks

好吧,我真的想說,RoR的Migrate和Scaffold這兩個東西實在是令我太吃驚了,我覺得大家應該都是衝著幾個好用的東西來玩RoR吧,先說說Migrate,它整合不同資料庫的語法,只要用RoR的專用寫法就可以通吃各大資料庫的格式,光是這點就很屌了(雖然我都是用MySqlXD),還有更屌的就是它加入了類似版本控制的功能,只要你「爽」,你要怎樣搞你的資料庫都可以!!

大家一定會說,這有什麼了不起的,我直接進資料庫改就好了,有什麼大不了的,哦不,那個鎖碎的動作現在都不用了,只要用Migrate的升級、降級,你要怎樣呈現你的資料庫都隨便你,什麼時候要新增或是刪除資料表也可以,要像玩仙境傳說Online一樣會回溯寶物都可以啦,這真的是太酷了!!

而Scaffold來建造CRUD的基本架構真的是很快(要改的多麼華麗就看個人了),以前都要寫個半死,現在只要幾個指令敲一下就通通跑出來了,省下很多不必要的時間,把這些時間拿去做一些比較深入的分析或是實作都比較划算,真的是很好用。

雖然現在還沒有玩的很透徹(我直接看官方API看了好幾天= =,因為台灣都沒有Rails 2.0以上的書,真是太該死了,就當練習吧! ),但是它基本好用的地方我已經了解到了,就差語法和API的呼叫就能夠比較上手了,加油!!

RoR Rocks => RRR

[RoR] 幹

為了這個東西,我不知道死了多少腦細胞,

一開始為了yml的問題,我不知道搞了多久,最後發現是Vim設定上沒有設好,導致RoR一直出錯,再來就是因為64bit和32bit的問題,因為「the Ruby interpreter bundled in XCode 3.0 is in fact only compiled as a 32-bit i386 executable」,很好,我用我的64bit版本的Mysql,就因為這樣死在這邊,GOOD。

最後把Mysql換回32bit,好棒,RoR終於可以讀Mysql的資料了耶~我的所有資料庫資料也因此全部消失了,耶~中間也花了好幾個禮拜的時間搞書和安裝設定一大堆相容性的問題,版本的差異也是個大問題,時間都不用錢的,超棒。

結論,為了這個RoR,我覺得,「得不償失」,幹。