What have you found for these years?

2009-01-21

小網站的標準流程 (1)

小網站的標準流程 (0)

上篇談 server 設定,本篇談 rails 設定。
(啊 merb 要死了,沒理由再用他了... 而且小東西還是 rails 比較快)

本機:

> mkdir NAME
> 把設計好的 html 搬進來
> rails .

> mkdir public/NAME
> mv public/{images,javascripts,stylesheets} public/NAME/

這樣做的原因是,網址的 root 會是 http://your_domain/NAME
也就是說捨棄 virtual host, 由 nginx 判斷 NAME, 再 forward 到
各個 upstream (沒意外的話是 thin). 用這個路徑的話可由 thin 或
nginx 不用動 rewrite 就可以 serve, 此外,設計好的靜態 html 也可以
用原本的 images/zzz.png 而不用改成 /images/zzz.png
只要固定一定有 NAME 這個 prefix 就行了。

所以 controller 也理所當然用 NAME 這個名字。

> script/generate controller NAME

無中生有的路徑就用他的 action name 命名,
其餘的全部用 config/routes.rb 寫死。
這是便於更新設計好的版面,靜態檔案就可以直接覆蓋,不用修改任何連結路徑!

以前覺得都不要動最好,後來知道要改,但現在又發現最好不要動!
要快還是這樣最好,適度地修改即可。例如 form 一定要改,
連結位置都不要動,就算他是 .htm 也沒關係,routes.rb 寫好對應即可。

大概像這樣:

  map.with_options :path_prefix => 'NAME', :controller => 'NAME' do |mp2|
mp2.index 'index.htm', :action => 'index'
mp2.form 'form.htm', :action => 'form'
end

於是更新版面什麼都不用動,直接蓋過去就好。
此外需要把 css 全部改成小寫,暫時靠 TextMate 改即可。
刪去空白,還有刪掉 UTF-8 的 BOM, 則靠 source-tools

> source-tools st:strip

這樣會刪去 trailing white spaces, 還有不該有的 utf-8 bom,
還有把 windows 該死的 CRLF 全部改成 LF.

至於 big5 轉 utf-8, 目前不常需要轉換,所以 task 還沒寫。
總之就用 iconv -f big5 -t utf-8 去轉。

然後記得刪掉一堆 rails 的垃圾。(小東西越乾淨越好,測試全免)

> rm -r test
> rm -r vendor
> rm -r doc
> rm README

沒用到的 helper 也都刪掉,layouts 也刪掉,除非有用到。
實在很討厭看到 repository 裡面一堆垃圾,尤其是沒用到的圖檔!!!
拜託不要把 demo 用的圖檔一股腦兒倒到 git/svn 裡面啊...
很浪費資源,尤其礙眼!

index 要做 redirect:
  def index
if request.path != index_path
redirect_to index_path
else
# ...
end
end

以免連接:
http://your_domain/NAME 沒有最後的 / 會使得相對路徑壞掉。

而 error_messages_for 在 rails 2.2.2 有 i18n 可以用之後,
變得比較好用了 @@ 首先下載 zh-TW.yml

> cd config/locales
> wget http://github.com/svenfuchs/rails-i18n/raw/master/rails/locale/zh-TW.yml
> cd ../..

接著把 locale 改成 zh-TW

> vim config/environment.rb

下面 i18n 的部份改成:

config.i18n.default_locale = 'zh-TW'

然後加入自己的翻譯,如:
  activerecord:
models:
user: 使用者
attributes:
user:
name: 暱稱
email: email
url: 網址

這邊每一個都要定義,不然會吐出奇怪的訊息。
其他像是錯誤訊息之類的,就用他預設的或是自己改即可,不用額外加上。

接著是奇怪的部份,由於 error_messages_for 需要一個有 errors 的 instance,
而我顯示錯誤的頁面,通常都跟 post 過去的頁面是分開的,
根本就無法取得這樣的 instance. 我認為這是設計不良,不過 rails 就是這樣。
我不想把任何東西存到 session 中,所以用 flash 紀錄,大概像這樣:
  def form
@user = User.new(flash[:user])
@user.save if flash[:user]
end

我會在 post 過去的 action 裡把 user.attributes 存到 flash 裡,
所以 redirect 回 form 時可以從此抽出剛剛輸入的資料。
啊如果是 redirect 回來的狀況,flash[:user] 會寫入東西,
也就是這是錯誤的輸入,需要顯示錯誤訊息,如何取得 .errors ?
就是白痴地跑 save 一次。反正不可能過,因為有錯誤才會回到這頁!

如果 flash[:user] 是空的,則是第一次來,什麼也不必做。

接著在 form 的 view 裡就可以用 error_message_for 顯示全中文錯誤訊息。

自訂訊息也行,大概就像這樣:
flash[:info] = user.errors.inject([]){ |r, i|
r << [I18n.t(i.first, :scope => [:activerecord, :attributes, :user]), i.last].join
}.join('\n')

有個 I18n.t 可以把英文訊息翻譯成中文...

於是 model 就可以省略任何的錯誤訊息!
不滿意他的 validates_presence_of 的話,也可以用自訂的:
  def validate_on_create
errors.add(:name, :empty) if name.blank?

是的!這邊只要指定欄位名稱,還有錯誤總類,會自動抓出相應的中文訊息!
不指定第二個錯誤種類的話,似乎就是 :invalid

這比之前在那邊蠻幹中文訊息好太多了....... 做小東西處理這些訊息最煩了。

*

另外 nokogiri 可以用 css 的方式抓資料,實在很方便!
doc.css('#container .blogbody .main').to_a[0..-2].join


這次大概就到這。

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0