這次因為有些地方中文字儲存後會變成一堆問號 ???????????

所以發現 rake db:migrate 時會需要注意 collation 的問題。

確認的話,如果有裝 phpmyadmin ,事情很簡單,反正有介面可用找一找就可以知道結果。

如果沒裝得下指令的話,指令如下:

查看db
use db_name;
然後下 status 就可以看到 db 的 collation

查看table
一般查看 table 指令是下 describe table_name; 但是這不會出現 collation
所以要改下 show full fields from table_name;

參考網頁:MySQL 於 命令列 查看 Table 權限、註解等欄位資訊

 

治標的方法是 migrate 檔案內,直接指定 table 的 collation 校對格式,寫法如下:

create_table (:table_name, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8')

 

如果 rake 指令已經下了,可以選擇回溯到某個日期的 migrate,指令為:

rake db:migrate VERSION=20100315074536
VERSION= 之後是 migrate 檔名開頭的 timestamp

 

如果不想回溯要直接改 collation ,指令是:

更改 db 的 collation
alter database db_name collate utf8_unicode_ci;

 

更改 table 的 collation
alter TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

目標:新機器上裝好 RoR 的 production 環境,並且可以做 deploy ,讓 local 端寫好的專案可以發佈上去並正常瀏覽。

注意:本目標不包含 git server 安裝,可以先利用 github 完成 repository 部分的需求。

參考資料

http://github.com/jnstq/rails-nginx-passenger-ubuntu
http://articles.slicehost.com/2009/4/9/debian-lenny-installing-apache2-and-php5
http://articles.slicehost.com/2009/7/3/debian-lenny-installing-passenger-with-apache
http://articles.slicehost.com/2009/4/9/debian-lenny-ruby-on-rails

 

流程:

1. 裝上 ruby 1.8.7
2. 裝上 rubygem / mongrel / rmagick
3. 裝上 rails 2.3.5
4. 裝上 git
5. 裝上 apache / mysql
6. 裝上 mod_rails
7. 裝上 實驗 project 測試運行
8. 開 deploy 用帳號 "apps"
9. 用 capistrano deploy 實驗 project

 

步驟說明:(註:藍底區塊表示terminal)

開始前請先 Update and upgrade the system

sudo apt-get update  
sudo apt-get upgrade


1. 裝上 ruby 1.8.7

注意這邊的 ruby 是要裝以 c 語言重寫過的 Ruby Enterprise Edition

Check for newer version at http://www.rubyenterpriseedition.com/download.html

Install package required by ruby enterprise, C compiler, Zlib development headers, OpenSSL development headers, GNU Readline development headers

sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline5-dev

Download and install Ruby Enterprise Edition

wget http://rubyforge.org/frs/download.php/66162/ruby-enterprise-X.X.X-ZZZZ.ZZ.tar.gz
tar xvfz ruby-enterprise-X.X.X-ZZZZ.ZZ.tar.gz
rm ruby-enterprise-X.X.X-ZZZZ.ZZ.tar.gz
cd ruby-enterprise-X.X.X-ZZZZ.ZZ/
sudo ./installer


Change target folder to /opt/ruby for easier upgrade later on

Add Ruby Enterprise bin to PATH

echo "export PATH=/opt/ruby/bin:$PATH" >> ~/.profile && . ~/.profile

Verify the ruby installation

ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux], MBARI 0x6770, Ruby Enterprise Edition 20090928

我當時安裝所下的指令如下:

sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline5-dev
wget  http://rubyforge.org/frs/download.php/68719/ruby-enterprise-1.8.7-2010.01.tar.gz
tar -zxvf ruby-enterprise-1.8.7-2010.01.tar.gz
cd ruby-enterprise-1.8.7-2010.01
sudo ./installer

2. 裝上 rubygem / mongrel / rmagick

這一步當初真是把我搞慘了,原因出在超多雷的 rmagick ,讓我硬生生的跳過,直到整個目標都完成才回頭找到底怎麼樣才能裝好 rmagick @@

以下的指令已經修正過,應該是不會有問題.....

wget  http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
tar -zxvf rubygems-1.3.6.tgz
sudo ruby setup.rb
alias gem='gem1.8'

sudo /opt/ruby/bin/gem install mongrel

rmagick 的部份,要先用 source code 來裝 ImageMagick,再用 gem 裝 rmagick
千萬不可以用 apt-get 裝 ImageMagick ,裝下去就會爆炸準備重來一次吧........

sudo apt-get install libperl-dev gcc libjpeg62-dev libbz2-dev libtiff4-dev libwmf-dev libz-dev libpng12-dev libx11-dev libxt-dev libxext-dev libxml2-dev libfreetype6-dev liblcms1-dev libexif-dev perl libjasper-dev libltdl3-dev graphviz gs-gpl pkg-config
wget  ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
tar xvfz
ImageMagick.tar.gz
cd
ImageMagick-6.6.0-4/
./configure --with-modules(重要!參數下錯待會兒 gem install rmagick 就會失敗)
make
sudo make install

ps. 附上當初找到的configure參數,如果用--with-modules也裝不起來可以試試。
./configure --disable-static --with-modules --without-perl --with-quantum-depth=8 --with-bzlib=no --with-libiconv

To avoid an error such as:
convert: error while loading shared libraries: libMagickCore.so.2: cannot open shared object file: No such file or directory
sudo ldconfig

sudo /opt/ruby/bin/ruby /opt/ruby/bin/gem install rmagick

 

3. 裝上 rails 2.3.5

sudo /opt/ruby/bin/gem install rails

 

4. 裝上 git

sudo apt-get install git-core

 

5. 裝上 apache / mysql

sudo apt-get install apache2 apache2.2-common apache2-mpm-prefork apache2-utils libexpat1 ssl-cert
sudo apache2ctl graceful

This should be installed before Ruby Enterprise Edition becouse that will install the mysql gem.
sudo apt-get install mysql-server libmysqlclient15-dev
sudo /opt/ruby/bin/gem install mysql
(沒有先安裝 mysql 再安裝 ruby 的話,就要下這行)

 

6. 裝上 mod_rails

sudo /opt/ruby/bin/gem install passenger
sudo apt-get install apache2-prefork-dev
sudo /opt/ruby/bin/passenger-install-apache2-module
sudo vim /etc/apache2/apache2.conf


貼上
LoadModule passenger_module /opt/ruby/lib/ruby/gems/1.8/gems/passenger-2.2.11/ext/apache2/mod_passenger.so
PassengerRoot /opt/ruby/lib/ruby/gems/1.8/gems/passenger-2.2.11
PassengerRuby /opt/ruby/bin/ruby


sudo /etc/init.d/apache2 restart

 

7. 裝上 實驗 project 測試運行

指令 git clone 拉下 testrails project
設定 database.yml、db migrate
rake dev:buld RAIL_ENV="production"
sudo vim /etc/apache2/apache2.conf
設定 virtual host

<VirtualHost *:80>
ServerName rails.wildjcrt.org
DocumentRoot "/home/
test/projects/testrails/public"
</VirtualHost>


sudo /etc/init.d/apache2 restart

 

8. 開 deploy 用帳號 "apps"

sudo /opt/ruby/bin/gem install capistrano

useradd -g deploytest apps
ssh-keygen rsa

將 id_rsa.pub 貼到github

 

9. 用 capistrano deploy 實驗 project

capify .
編輯 config/deploy.rb 做好設定
cap deploy:setup
cap deploy

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

通常問題是發生在本機端有做更動,遠端的 repository 也有其他人更動過,但是 code 的變動是屬於對立情形,git 無法自動 merge 成功,導致做 git pull 會出現 conflict。

依序指令下 git stash (會先將本機更動的檔案暫存)

git pull (會將 repo 程式碼拉回來並做 merge,其實 pull 指令本來就是 fetch + merge)

git stash apply (將暫存的 code 與現在 pull 後的 code 做 merge)

 

到此會分兩種情形,一種是 apply 成功,那就直接推上去

git commit

git push

另一種是 apply 後會發生 conflict ,這時候就要開啟編輯器,去看有 conflict 的程式碼,手動解決衝突(你會發現程式碼內有標明衝突區段),解完推上去,然後繼續拉 repo 程式碼

git commit

git push

git pull

如果 pull 之後又有 conflict ,就繼續手動解決衝突,然後 push ,反覆此行為直到你 pull 為 up-to-date 的狀態。

笨笨小蟹 發表在 痞客邦 留言(1) 人氣()

如果在 commit 時,指令只有下 git commit ,那後果就是無法清楚的知道本次 commit 的目的,是修正錯誤呢?新增功能呢?還是想完成什麼事情。

這對開發來說是種大忌,因為會造成維護以及交接上的災難,因此每次 commit 時,指令建議下 git commit -m ,這樣就會自動跳到預設編輯器,讓你可以輸入 commit tilte 。

我個人則是習慣直接下 git commit -m "本次 commit 的目的",這樣就會直接出去並填好 commit title ,不會跳編輯器出來。

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

一開始都是很習慣下 git add . 這個指令,會把大部分的更動檔案都加入;

如果有遺漏的(像是 untracked ),就再用 git add -u 加入。

不過實際上在寫 rails 專案時,這種習慣並不好,每次的 git commit -m 應該都有明確的一項任務,比方說某個page、某張ticket、某個任務需求。

推薦在加入檔案時,指令下 git add -i ,也就是互動模式,進入後選2可以選擇哪些檔案要加入,3是移除已加入的檔案,4是加入untracked的檔案。

完成後選1可以確認狀態,然後再下 git commit -m 。

 

附註:git add -i 也可以用來移除不小心加入不該加入檔案的狀況,進去選3就可以移除本次 commit 不想上去的檔案。

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

git add 前,要記得先看一下 git status ,不需要 commit 的就不要加入。

git commit 之前,要確認一下 .gitignore ,以免把 test 或是 database 的資料也丟上去了。

工作平台上的 rails 指令,要記得加上 RAILS_ENV=production 。

太多判斷式的 code ,就丟到 helper 裡面包起來,程式也會比較易讀。

helper 裡面的 method ,一定要寫 return ,避免呼叫後不曉得是哪段程式 return 結果。

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

rails 在執行動作時,預設都是跑 development 環境,利用這一點可以避免下錯指令而把機器弄掛。

在 production 實際運作的平台上,指令一律必須加上 RAILS_ENV=production 才會跑出你想要的結果。

例如 rake db:migrate RAILS_ENV=production

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

雖然常常在用rake,但是運作方式跟寫法卻常搞不清楚。

railsenvy的這篇教學看完就可以大致了解rake。

rake教程英文版

rake教程中文版

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

指令 annotate

下了之後,會自動幫你塞 data schema 到 model 的 .rb 檔案中!

超好用!

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

Rails 寫好之後,常常需要去查看狀態,最原始的方法就是到 sql 裡面去觀察,不過 Rails 本身也有提供指令可用,就是下 script/console 。

進入console後,可以使用 model 的物件來查看狀態,比方說有個model是 Post ,就可以下 post.last 或是 post.all 等查看狀態。

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()