作者歸檔:船長

RailsSpace: Building a Social Networking Website with Ruby on Rails 學習筆記

RailsSpace: Building a Social Networking Website with Ruby on Rails>是一本從Ruby on Rails基礎教起的實例教程。但與共為實例教程的<Agile Web Development with Rails> 相比,<RailsSpace: Building a Social Networking Website with Ruby on Rails>有着自己明顯的特色。後者教授的不僅是Ruby on Rails的語言知識, 而且夾雜了更多的編程技巧和思想,我感覺更適合具有一定Ruby on Rails基礎的人員,使之從“知道Ruby on Rails知識”提升到“在實戰中運用Ruby on Rails"的新層次。

雖然我看過<Agile Web Development with Rails>, 但還是我在<RailsSpace: Building a Social Networking Website with Ruby on Rails>中發現的新奇的東西:

<%= link_to_unless_current "Home",     :action => "index" %>
原來Rails中還有link_to_unless_current。

MySQL的發音是"My-Ess-Cue-Ell".

YAML 是 Ain’t a Markup Language 的縮寫。

rake db:migrate VERSION=0, 可以用來月光寶盒數據庫版本。

save比save()有更重的ruby味。

在irb的console中可以使用reload!來重載被修改後的環境(我原來一直是退出來再進一次!)

正則實例:    /^[A-Z0-9._%-]+@([A-Z0-9-]+\.)+[A-Z]{2,4}$/i,
這個用來校驗email地址。
^:字串行的開始
[A-Z0-9._%-]+:至少一位下列有效字符:大寫字母,數字,點,下劃線或桿線
@
([A-Z0-9-]+\.)+:至少一組以點分隔的帶有大寫字母,數字或桿線的字串
[A-Z]{2,4}:2至4位的大寫字母
$:字串行結束
i:因為電郵地址不區分大小寫字母,這個i指定正則不對字母的大小寫不感冒。

用戶的密碼不一定要加密後存到數據庫中去。

為了使fieldset/legend HTML標籤在IE中正常顯示,可能要進行CSS Hack.
/* Hack to get IE to display fieldset/legend correctly */
html fieldset {
  position: relative;
}
html legend {
  position:absolute;
  top: -1em;
  left: .5em;
}
html fieldset {
  position: relative;
  margin-top:1em;
  padding-top:2em;
  padding-bottom: 2em;
}

可以在layout中加入顯示debug信息的功能。

分離出SCREEN_NAME_SIZE = 20,PASSWORD_SIZE = 10,EMAIL_SIZE = 30等HTML表格參數,方便統一管理。在view中以下面的方法調用:
<div class="form_row">
<label for="email">Email:</label>
<%= form.text_field :email,
:size => User::EMAIL_SIZE,
:maxlength => User::EMAIL_MAX_LENGTH %>
</div>

inspect可以用來顯示post的內容:aise params[:user].inspect

在Ruby中只有false和nil才是false的。

可以為系統的錯誤指示息做一套漂亮的CSS外衣。如:
/* Error Reporting Styles */
.fieldWithErrors {
  margin: 2px;
   padding: 2px;
   background-color: red;
   display: table;
}
#errorExplanation {
  border: 2px solid red;
  padding: 7px;
  padding-bottom: 12px;
  margin-bottom: 20px;
  background-color: #f0f0f0;
}
#errorExplanation h2 {
  text-align: left;
  font-weight: bold;
  padding: 5px 5px 5px 15px;
  font-size: 12pt;
  margin: -7px;
  background-color: #c00;
  color: #fff;
}
#errorExplanation p {
  color: #333;
  margin-bottom: 0;
  padding: 5px;
}
#errorExplanation ul li {
  font-size: 11pt;
  list-style: square;
}
…………..

rake doc:app可以用來生成實例文檔。

title = assigns(:title) 產生 title = @title的效果.

測試的命令:rake test:functionals,rake test:units, rake, rake stats,ruby test/functional/user_controller_test.rb -n /test_login_failure/, rake recent….

關於錯誤信息,0的使用還有sprintf:
>> @error_messages = ActiveRecord::Errors.default_error_messages; 0
=> 0
>> @error_messages[:too_short]
=> "is too short (maximum is %d characters)"
>> sprintf(@error_messages[:too_short], 17)
=> "is too short (maximum is 17 characters)"

使用數據庫作為session儲存方案可以讓網站更方便地擴展成多服務器網站。使用方法:
1. 運行 rake db:sessions:create
2. 將config/environment.rb, uncomment 中下行的注釋#去除:
       config.action_controller.session_store = :active_record_store
3. 運行rake db:migrate
4. 重啟服務器。

當發生與session相關的錯誤時,可以試着清空數據庫的session表。

用下列語句來快速校驗用戶密碼。
user = User.find_by_screen_name_and_password(screen_name, password)

session[:user_id]返回的是數值,而not session[:user_id].nil?返回的是boolean值,有時候使用兩者程序效果一樣,但對編程者本身的頭腦邏輯清晰度卻會有區別。

使用mixin,將一個通用method放到helper中去,這樣不但view中,而且在controller中加入include ApplicationHelper語句後也可以使用這個method.甚至test…

大量使用外套(abstraction layer)!!

user.save和user.save!都可以用來發送將user存儲到數據庫這一指令。區別在存儲失敗之後的表現上。user.save失敗後只會返回一個false值(可以用if user.save判斷), 而一旦user.save!失敗,將會產生一個exception錯誤。所以在使用意圖上,允許一定條件下(控制之中的)失敗時,用user.save,而期望它一定要成功(不然就要啟動應急rescue措施)時,用user.save!.

在一class內可以省略語句中attribute和function里的self關鍵字(self.id->id),但有一例外,就是在賦值的時候, self.name = "Jom"不能省為name = "Jom",因為後者只會產生一個值為"Jom"的本地變量!

這個實例可以用來解決找不到定義好的變量的問題:<% field_title = nil if not defined?(field_title) -%>

用名詞命名controller,用動詞命名action.

當發現所有instance變量為nil時,檢查一下是不是誤用到了RoR的保留字。

將類DB_STRING_MAX_LENGTH = 255的常量放到config/environment.rb文件中,這樣可以在全局中引用。

@user.spec["first_name"]和@user.spec.send("first_name")等同於@user.spec.first_name

在rout.rb中加入
map.profile ‘profile/:screen_name’, :controller => ‘profile’, :action => ‘show’
後可以使用  profile_url(:screen_name => ‘foobar’)生成profile的url.
在view之外的地方引用可以先 helper :profile (它和include ProfileHelper的不同點???)
included ProfileHelper 是為了使用 profile_for. partial中引用的話要用helper: profile????

MySQL的TEXT欄不支持默認值。手動設置方法
  def initialize
    super
    QUESTIONS.each do |question|
      self[question] = ""
    end
  end

initial function在class新建instance時會被運行。如果class有上級,會自動繼承上次的initialize function. 在子class中加initialize function, 使用super,這樣會調用上級initialize function.

生成所有單字母串的方法:
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")
或 %w(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)

使用列表樣式的實例:
<% @letters.each do |letter| %>
<% letter_class = (letter == @initial) ? "letter_current" : "letter" %>
<%= link_to letter, { :action => "index", :id => letter },
:class => letter_class %>
<% end %>

如果action之後還要用到id, rout.rb中沒有用到id的url要加入:id=>nil的參數。

pluralize的用法
>> pluralize(0, "box")
=> "0 boxes" #0時用複數
>> pluralize(1, "box")
=> "1 box"
>> pluralize(2, "box")
=> "2 boxes"
>> pluralize(2, "box", "boxen")
=> "2 boxen" #自定義複數形式的方法

原來安裝和使用ferret搜索引擎的方法這樣簡單:
1安裝ferret gem
> sudo gem install ferret
2下載安裝acts_as_ferret插件
> ruby script/plugin install svn://projects.jkraemer.net/acts_as_ferret/tags/stable/acts_as_ferret
Feeret首次搜索一個model時會耗費一定的時間在Rails的根目錄下的index目錄生成索引文件。當Ferret出問題時,可以試着在停止網頁服務器後刪除這個索引目錄,讓它重新生成索引文件。

合併兩個實例列用concat+uniq!
@users.concat(hits.collect { |hit| hit.user }).uniq!

為實例列排序
@users = @users.sort_by { |user| user.spec.last_name }

search form 使用GET request

可用   Spec.find(:all, :conditions => ["gender = :gender", params])來取代Spec.find(:all, :conditions => ["gender = ?", params[:gender]])

改寫默認string class的方法在lib/string.rb中
class String
#寫自己的method
end

replace能用另一個object取代自己,如:
  def capitalize_each
    space = " "
    split(space).each{ |word| word.capitalize! }.join(space)
  end
  # Capitalize each word in place.
  def capitalize_each!
    replace capitalize_each
  end

寫一個檢查整數的method:
class Object
  # Return true if the object can be converted to a valid integer.
  def valid_int?
    begin
      Integer(self)
      true
      rescue ArgumentError
      false
    end
  end
end
注意nil.valid_int? 返回 true (Integer(nil) == 0) 但 nil.valid_float? 返回 false(Float(nil) 產生 ArgumentError exception).

使用.errors.add("xxx")的方法寫校檢method.
  def valid_input?
    @spec = Spec.new
    if @spec.valid? and not zip_code.blank? and location.nil?
      @spec.errors.add(:zip_code, "does not exist in our database")
    end
    unless miles.nil? or miles.valid_float?
      @spec.errors.add("Location radius")
    end
    # The input is valid iff the errors object is empty.
    @spec.errors.empty?
  end
在view中定製引用錯誤提示信息:
<%= error_messages_for(‘spec’).sub(‘prohibited this spec from being saved’,
‘occurred’) %>

沒有super class的module helper中不帶任何class.所以要自己require:
module ApplicationHelper
  require ‘string’

使用File.join生成文件目錄,以適應不同平台的操作系統?

為了上傳圖片,必須使用multipart encoding。
<form action="upload" enctype="multipart/form-data" method="post">
<input id="avatar_image" name="avatar[image]" size="30" type="file" />
</form>

PNG (發音:"ping"), 指Portable Network Graphics格式.

使用system("ls")可以調用系統的ls命令。

上傳的文件如果小於15K,將是StringIO (string input-output)類,如果大於15K,將是Tempfile (temporary file)。 為了統一兩者,可以用File.open(source, "wb") { |f| f.write(@image.read) }將文件寫出,"wb" 這裡指 "write binary"。

errors.add(:image, "totally doesn’t work")將錯誤信息加到一個attribute之上。 errors.add_to_base("There’s no freaking way that worked")會將錯誤信息加到全局。

默認情況下電郵將以text格式發出; 參考:
http://wiki.rubyonrails.org/rails/pages/HowToSendHtmlEmailsWithActionMailer

重寫ActiveRecord的子class的initialize function後,可以在保留它的validation function的同時避免將數據寫到數據庫里。

Active Record的create=new+save, save返回boolean, create直接返回object.

在class內引用此class的class method可以省略class名。

destroy比delete更強大,更適合用來消除Active Record objects.

user.friends
user.requested_friends
user.pending_friends
可以這樣連串!!!
has_many :friendships
has_many :friends,
:through => :friendships,
:conditions => "status = ‘accepted’"
has_many :requested_friends,
:through => :friendships,
:source => :friend,
:conditions => "status = ‘requested’"

RESTful式的URLs沒有action部分,因為它的格式是:/controller/id;modifier

has_many可以加上order參數:
has_many :posts, :order => "created_at DESC"

內置的time_ago_in_words method,畢竟有!!雖然我不喜歡這個。
Posted <%= time_ago_in_words post.created_at %> ago

format.html用來回應HTML文件請求,format.js可以用來回應Javascript請求。

使用js更新頁面
        render :update do |page|
            format.js
        end
action.rjs
          page.hide "add_comment_link_for_post_#{@post.id}"
          page.replace_html "new_comment_form_for_post_#{@post.id}",
          :partial => "new"
使用RJS文件,將controller中view的部分分開來,更合理。

Ajax的運行有可能使客戶機,特別是老機子變得很慢甚至癱瘓。

http://wiki.script.aculo.us/scriptaculous/show/CombinationEffectsDemo
中的很多特效中我最喜歡的是
 blind down/up, highlight,puff

如果Ajax運行不正常,可以先檢查log文件。

鏈接的href選項可以為不支持JavaScript的用戶提供常規鏈接。

rake db:migrate RAILS_ENV=production,準備production數據庫

- Linux/Apache/mod_proxy_balance/Mongrel 發布方案
- Caching和shared nothing scaling方案
- Subversion 版本管理
- Capistrano 發布版本控制

為網站寫一個管理後台??

在console中按production環境啟動
> ruby script/console production
> ruby script/console production –sandbox 不修改數據庫

查看日誌的最後一頁:
tail -f log/production.log

在本地訪問時Rails會公布全文錯誤信息,但遠程用戶會指向public/404.html 或 public/500.html 文件。

更多關注的書:
Practical Rails Social Networking Sites (Expert’s Voice)
The Rails Way (Addison-Wesley Professional Ruby Series)
Pro ActiveRecord: Databases with Ruby and Rails (Pro)
Advanced Rails Recipes: 72 New Ways to Build Stunning Rails Apps
Agile Testing with Ruby and Rails

發表在 Ruby on Rails | 留下評論

宣州謝朓樓餞別校書叔雲 李白

棄我去者,昨日之日不可留;
亂我心者,今日之日多煩憂。
長風萬里送秋雁,對此可以酣高樓。
蓬萊文章建安骨,中間小謝又清發。
俱懷逸興壯思飛,欲上青天攬明月。
抽刀斷水水更流,舉杯銷愁愁更愁。
人生在世不稱意,明朝散發弄扁舟。

發表在 詩詞精選 | 留下評論

將進酒 李白

君不見,黃河之水天上來,奔流到海不復回。
君不見,高堂明鏡悲白髮,朝如青絲暮成雪。
人生得意須盡歡,莫使金樽空對月。
天生我材必有用,千金散盡還復來。
烹羊宰牛且為樂,會須一飲三百杯。
岑夫子,丹丘生,將進酒,君莫停。
與君歌一曲,請君為我側耳聽。
鐘鼓饌玉不足貴,但願長醉不復醒。
古來聖賢皆寂寞,惟有飲者留其名。
陳王昔時宴平樂,斗酒十千恣歡謔。
主人何為言少錢,徑須沽取對君酌。
五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。

發表在 詩詞精選 | 留下評論

歸去來辭 陶淵明

      歸去來兮!田園將蕪胡不歸?既自以心為形役,奚惆悵而獨悲?悟已往之不諫,知來者之可追;實迷途其未遠,覺今是而昨非。

舟遙遙以輕揚,風飄飄而吹衣。問征夫以前路,恨晨光之熹微。乃瞻衡宇,載欣載奔。僮僕歡迎,稚子候門。三徑就荒,松菊猶存。攜幼入室,有酒盈樽。引壺觴以自酌,眄庭柯以怡顏,倚南窗以寄傲,審容膝之易安。園日涉以成趣,門雖設而常關。策扶老以流憩,時矯首而遐觀。雲無心以出岫,鳥倦飛而知還。景翳翳以將入,撫孤松而盤桓。

歸去來兮!請息交以絕游。世與我而相遺,復駕言兮焉求?悅親戚之情話,樂琴書以消憂。農人告余以春及,將有事乎西疇。或命巾車,或棹孤舟。既窈窕以尋壑,亦崎嶇而經丘。木欣欣以向榮,泉涓涓而始流。羨萬物之得時,感吾生之行休。

已矣乎!寓形宇內復幾時,曷不委心任去留,胡為遑遑欲何之?富貴非吾願,帝鄉不可期。懷良辰以孤往,或植杖而耘耔,登東皋以舒嘯,臨清流而賦詩。聊乘化以歸盡,樂夫天命復奚疑。

發表在 詩詞精選 | 留下評論

涉江采芙蓉 佚名

涉江采芙蓉,蘭澤多芳草。
采之欲遺誰?所思在遠道。
還顧望舊鄉,長路漫浩浩。
同心而離居,憂傷以終老!

發表在 詩詞精選 | 留下評論

登科後 唐﹒孟郊

昔日齷齪不足誇,
今朝放蕩思無涯。
春風得意馬蹄疾,
一日看盡長安花。

太暢意了!高興得有點像小孩了。對比前之前的一再落第--

一夕九起嗟,
夢短不到家。
兩度長安陌,
空將淚見花。
--《再下第》

發表在 詩詞精選 | 留下評論

少女日記(全)

2002年8月18日 晴
今天是星期天,外面陽光明媚,但我不想出去。很煩。不知道我為什麼一直想着他,而他卻一直冷漠,對我視而不見。我一直不知道思念真的這麼傷人,直到楊說我瘦了。

2002年11月13日 陰
他走了!!!一句也沒說就走了。我恨他!!!但是,為什麼我的腦海中全都是他????楊說得對,我真的很傻。

2003年3月3日
再過3個月就高考了,父母很擔心。因為上次母親看到我們在一起了。但我們真的不是那種關係。我也跟他說了,我對他沒有那種感覺,雖然我真的很感謝他,在我最傷心的時候過來安慰我。

2003年5月7日
和他在一起的時候我的心裡卻想着另一個人,一個不曾關心我,一個對我如此冷血的人!!!!!
楊送來的試卷我一點都沒有心情看。天啊,都什麼時候了,我還是靜不下心來。我是怎麼了????

2003年7月2日
今天我沒有去約定的地方等他。我希望這個決定是對的。我不想再欺騙他,也不想在欺騙自己。我就是說過我對他沒有那種感覺。他是一個執着的人,無奈我也是一個執着的人。。。我已經跟他說過我忘記不了那個人!!!上天不會放過我的,它要我受一輩子的折磨。

2003年9月19日
雖然不知道因為他本人還是從他身上看到的那個的影子,但見到他我真的是不知所措。還好楊幫我要來了他的電話,現在我很煩,不知道要不要打電話給他,也不知道要說些什麼。。。

2004年1月14日
看着人來人往的人群,更體會到自己的寂寞。3年了,我一直在思念着一個影子!!!!
我到底在思念他,還是把他當成寂寞的出口????
今天我才發現自己有多傻。不要說他遠在天邊,即便他現在立即站在我面前又能怎樣? 能給我什麼呢?像他這樣無情的人能給我一生的幸福嗎??? 從今天起我要把他忘記!!!

2005年4月3日
躺下後我確定自己真的在思念一個人。這思念很強烈。沒想到我在關上心門這麼久後還會為一個人心動。
我是真的愛楊嗎??

發表在 某時雨集 | 留下評論

上午要睡覺之20070529 徙步峨眉山3 雷洞坪 接引殿 太子坪 卧雲庵 金頂

20070528 寺廟裡的床高低不平。而且在房內聽得到隔壁房住客在木樓地板上走動的聲音和說話聲音。還好住的都是爬山的旅客,或許大家都很累,所以都早早地休息了。。。


半夜時,房頂上一陣噼里啪啦的響聲吵醒了我們。果真是猴子,早上我們發現他們還在上面戲耍。
可惜的是,我的心沒有峨眉山寺廟這些用鐵皮做的房頂堅固,被猴子吵醒後,我就再也沒有心思重新入睡了。 繼續閱讀

發表在 人在旅途, 浮光掠影 | 一條評論

上午要睡覺之20070528 峨眉山2 白龍洞 萬年寺 息心所 長老坪 初殿 華嚴頂 鑽天坡 洗象池

20070528 早上我們不到9點就起了床,吃完麵條後從清音閣繼續向我們的目標金頂出發。

上午的清音閣熱鬧的像個市場,而後面的山路上是人山人海,他們全都往下走,而我們只得慢慢地向上擠。

繼續閱讀

發表在 人在旅途, 浮光掠影 | 留下評論

善良 美麗 溫柔 幽默 智慧 的陳昭妃

很妒忌張瑞康能娶到她。

1962年出生於中國台灣嘉義。
10歲隨家人稱居海外。
"從小喜歡的是鋼琴,也一度希望成為一個有為的鋼琴家“,後來 "神奇的化學試驗將我引入醫學之門"
19歲,已經以優異的成績從美國楊伯翰大學畢業,成為該校最年輕的大學畢業生
21歲,獲得微生物學碩士學位
1988年,25歲的陳昭妃博士畢業,主攻免疫學專業。
一次探視一位年輕的癌症女病人傷心經歷促使陳昭妃最終將自己的研究方向從治療轉向了預防。

陳昭妃創立“營養免疫學”,提倡通過植物性營養提升人體的免疫功能,預防疾病。
1996 榮獲美洲“傑出女青年獎”,同時,美國加州命名1996年3月8日為“陳昭妃日”。
1997年榮獲由美國青商會頒發的"美國十大傑出青年獎"。 陳昭妃博士是第一位榮獲此獎項的華裔人士。美國歷任總統羅斯福、肯尼迪、福特、克林頓等都曾獲此國家極高的榮譽。

正是因為"深以為"自己是一個中國人,直到今天,昭妃沒有一個英文名。這導致她多年讀書、後來當助教以至今天,都經常會有人念不好她的名字。對此,陳昭妃的辦法是,不怕麻煩,一遍遍地教他們,直到念對為止。

營養免疫學實用要點:
多吃素食
不生氣
休息與運動(一周走路2,3小時)

感覺這個學問應該叫“免疫營養學“更為貼切一些。基本理念和傳統中醫上的以防為治的思想很相近。

參考:
http://women.sohu.com/77/14/women_article17101477.shtml
http://post.baidu.com/f?kz=86287725
《陳昭妃博士講營養免疫學》視頻演講

發表在 成敗幾何 | 留下評論