對抗垃圾信!請您點這裡:

我的E-mail:
我的Skype:My status

2008年7月3日

HTTP Response 500!?

剛剛在解決一個小Bug
用瀏覽器瀏覽某個會丟301的網站時,在Ruby或Telnet都會丟500回來
什麼鬼.. 怎麼會這樣?

其實這是因為沒有User-Agent的關係啦
有些Web Server可能會Reject一些Header中沒有User-Agent的Request
所以這時候只要在丟request時加上User-Agent這個Header即可
原本的原始碼:

response = Net::HTTP.get_response(URI.parse(uri_str))
改成:
uri = URI.parse(uri_str)
http = Net::HTTP.new(uri.host)
response = http.send_request('GET', uri.request_uri, {"User-Agent" => "Mozilla/5.0"})
這樣一來不管是301、302,還是最該死的404都沒問題啦XD

(( 因為這篇是工作上的心得,所以只好擺在Rails啦XD

2008年6月24日

修改error_messages_for,讓表單錯誤資訊中文化更完整

今天摸會了Git,就順便應用上了
error_messages_for大家都用過,也都知道這個不管再怎樣中文化,欄位名稱一樣都會出現給你看!
這真的是令人又愛(英語體系者愛)又恨(非英語體系者恨)的功能啊..
沒辦法,只好自己動手了...
我剛剛發了Git pull給Rails團隊,他們接受不接受我不知道,所以在這邊教大家如何自己搞定這一切
首先,先打開Rails這部份的原始碼
假設我Ruby安裝在C:\
所以路徑就是:C:\ruby\lib\ruby\gems\1.8\gems\actionpack-2.1.0\lib\action_view\helpers\active_record_helper.rb
接 著,跳到error_messages_for那段程式碼,在options = params.extract_options!.symbolize_keys底下加入:fields = options[:fields].nil? ? {} : options[:fields]
然後把error_messages = objects.sum {|object| object.errors.full_messages.map {|msg| content_tag(:li, msg) } }.join這行註解,改為:

error_messages = objects.sum {|object| object.errors.full_messages.map {|msg|
unless fields[msg.split(" ")[0].downcase.to_sym].nil?
msg = msg.split(" ")
field_name = msg.shift.downcase!
msg = msg.reverse.push(fields[field_name.to_sym]).reverse.join(" ")
end
content_tag(:li, msg)
} }.join
存檔離開,然後這樣用:
error_messages_for(:project, :fields => {:name => "專案名稱", :summary => "專案摘要"})
而content_tag產生出來的就會是
  • 專案名稱 can't be blank

  • 專案摘要 can't be blank

  • 很簡單吧:P?
    注意,只能夠傳小寫的symbol進去
    沒辦法,我功力太差了=_=|||
    可以參考這邊:http://github.com/cfc/rails/commit/9e38903fd10a2de9ae9c2ca53623469f3575b43c
    有任何問題歡迎提出,也可以在github上commit給我
    多謝多謝:P

    2008年4月17日

    Yahoo-LifeType-API (Yahoo!奇摩生活+ Ruby API)

    今天剛看到生活+釋出API(其實早就釋出了,API網址:http://tw.developer.yahoo.com/lifestyle_api.html)後,就開始把NetBeans打開來寫程式了XD
    現在RubyForge的專案還沒開,倒是GoogleCode的已經開了(網址:http://code.google.com/p/yahoo-lifetype-api/)
    程式是BSD授權,忘記怎樣包裝Gem檔,等到哪天想起來再包XD
    程式使用範例(列出生活+的分類):

    #!/usr/bin/env ruby
    APPID = "NhYX9XjV34FPxdq7zD8T7wwc4QGI5VWu_48NHh03zbPYUfPpcWrpZzhcVDKFQsH9dQ--"
    require 'lifetype'
    require 'rexml/document'
    include REXML

    puts "獲取生活+類別中... 請稍後"
    doc = Document.new(LifeType::Class.new(APPID).listClasses)
    puts "獲取類別結束"
    puts "類別總數: " + doc.get_elements("//rsp/ClassList")[0].attribute("count").to_s
    puts "列出類別中... 請稍後"
    doc.elements.each("//rsp/ClassList/Class") do |ele|
    puts "ID: #{ele.attributes["id"]} -- #{ele.get_elements("Title")[0].text}"
    end
    puts "列出類別結束"
    很簡單的就可以使用了,還有doc喔!
    有Bug可以丟到GoogleCode的Issues或者丟到我信箱內
    謝謝^^