Rails三兩事 A website introduce you ruby&rails and technology news.

28Jun/100

Ruby on Rails with Uploadify

在檔案批次上傳最早是使用Swf_upload. 但由於很難修改裡面的一些東西,而且只針對Flash.
後來尋找了一下,Plupload及Uploadify看起來比較好,有支援Falsh,SilverLight,Html5,Html4...etc
所以改用Plupload,"看起來"很好用,但實際上有一堆神秘的Bug.
最後改用Uploadify,雖然一樣有bug,但是都有解法.

最佳解法請參考 : http://railsfun.tw/viewthread.php?tid=257

其中在使用UploadifySettings時,遇到 InvalidAuthenticityToken的問題,這是Uploadify本身的問題.
解法很簡單,卻花我很多時間...
在被init的物件內加上 style='display:block;' 即可.
比如


--官方網展
http://www.uploadify.com/

--其他參考資料
1. http://railstips.org/2009/7/21/uploadify-and-rails23
2. http://jetpackweb.com/blog/2009/ ... degrade-gracefully/

6Jun/100

Heroku send by Gmail

在Rails上透過Gmail寄信是蠻簡單的.
但網站搬到Heroku後最近發現似乎寄信有問題?
一查之下才知道要裝套件,官方網站其實就有,不過自己還是做個紀錄.

1.Install Plugin

$ script/plugin install git://github.com/adamwiggins/gmail_smtp.git

2.設定帳號

$ export GMAIL_SMTP_USER=username@gmail.com
$ export GMAIL_SMTP_PASSWORD=yourpassword

3.設定Heroku

$ heroku config:add GMAIL_SMTP_USER=username@gmail.com
$ heroku config:add GMAIL_SMTP_PASSWORD=yourpassword

完成. :D

4Oct/092

Rails on Ubuntu 9.04 Installtion

由於在Ubuntu下安裝Rails是一件有點煩的事,還要ln, 而且有時候有lib相依問題.
不是單純 apt-get install ruby rails 就可以.
所以就把自己安裝的經驗寫下來,下次自己安裝方便,而也可以分享.

打開Console輸入,這樣安裝包含了 Ruby, IRB, RdoC, Mysql, Sqlite, Sqlite3, 以及Libs , Dev

sudo apt-get install ruby irb rdoc libopenssl-ruby mysql-server sqlite3 sqlite libsqlite3-ruby libsqlite-ruby libmysql-ruby ruby1.8-dev

到官方下載 Rails Gem 這篇文章時,Gem為1.3.5版,點我下載1.3.5.tgz.
將之解壓縮並在Console cd到資料夾下

ruby setup.rb

再修正9.04下的安裝路徑連結錯誤

ln /usr/bin/gem1.8 /usr/bin/gem

安裝Rails

gem install rails

安裝Rake 及 Mongrel

sudo apt-get install rake mongrel

打完收工,Done!!

完成之後,可以再參考這篇Textmate on Ubuntu - Gedit

29Sep/091

Rails的Find SQL語法在多變情況下.

前陣子寫內部簡單的Search Engine,面對SQL其實突然有點失措.
在Rails底下,sql通常是下指令如
Find, Find_by.
傳統的是 Obj.find(:all,:conditions=>["sql command",vara ,varb ,varc])
然而有時要做進階的判斷,依據狀況可能有不同的參數&Conditions,又不想單純的find_by_sql.
如何改變conditions指令呢?

fcon=['']
fcon[0]="a like ? and b like ? and c like ?"
fcon << params[:a]
fcon << params[:b]
fcon << params[:c]

fcon[0]="d like ? and e like ? and f like ?"
fcon << params[:d]
fcon << params[:e]
fcon << params[:f]

Obj.find(:all,:condition=>fcon)

如此一來就不用find_by_sql,又可以達成conditions的變化.

6Mar/090

Ruby的Metaprogramming

對一個程式新手來說,什麼是Metaprogramming? 一定非常疑惑.
而對Metaprogramming而言,Ruby是一個非常好的選擇.
但,但底什麼是Metaprogramming?
查字典,你查不到Metaprogramming. 於是將Meta和Programming分開查.
你查到了類似 "超越...之前" 和 "程式語言",但這看的懂才怪.
於是你又上wiki,英文看不懂看中文, 中文寫"元編程". 靠,這不是對岸的用詞嗎?
搞老半天你還是不懂,你想哭,想放棄了.

其實Meta programming就是在 程式碼中製造(產生)程式碼, 或說 用 code寫code.
相信大家都聽過物件導向,物件導向提倡的就是 模組化,繼承,等功能.
這些功能都只為了幾個目地 : 讓東西可以重覆使用. (個人認為還有好管理,因為將功能模組化了)
這樣一來,你便不需要一而再再而三的重覆編寫已有的功能.

但人們是懶惰的,於是讓"程式碼自動產生",連寫都不想寫的想法產生,這就是Meta programming.

以Ruby而言,簡單的範例如下 :

class Dog
  attr :leg,true
end
Tom=Dog.new
Tom.leg    #=>nil
Tom.leg=4 #=>4
Tom.leg    #=>4

讓我們先再看另一個範例

class Dog
end

%w(Won Wonwon Au Uuuu).each do |name|
  Dog.class_eval <<-HERE
    def #{name}()
      p 'Dog bark:  #{name.upcase}!'
    end
  HERE
end

Tom = Dog.new
Tom.Won
Tom.Wonwon
Tom.Au
Tom.Uuuu

第二個範例的顯示是Dog bark: WON! ....以此類推.

第一二個範例都顯示了只以簡單的幾行就建立出一些重覆性的函式.
第一個範例attr是內建的,當你attr,後面加true屬性,它會為你自動建立一個getter以及一個setter.
第二個範例則是以字串陣列的形式,將名稱傳入HERE文件,並透過eval將它實體化.

兩個範例應該很快的顯示了Ruby為何被稱為適合Metaprogramming了.

--延伸閱讀
關於Meta programming
Digging into Ruby Symbols
Seeing Metaclasses Clearly
An Exercise in Metaprogramming with Ruby - ' Metaprogramming Intro '

關於Eval
Evaluation Options in Ruby

6Mar/091

關於RUBY :Symbol的定義

對於初學RUBY的人,不管是新手或有程式底子,也許多少都會對Symbol的功用感到疑惑吧,而我也是那麼一個.
翻了很多文章,在網路上的高手解釋之後,我多少大概瞭解SYMBOL的功用.
打開command line輸入ri Symbol看看它的解釋.

Symbol objects represent names and some strings inside the Ruby interpreter. They are generated using the :name and :"string" literals syntax, and by the various to_sym methods. The same Symbol object will be created for a given name or string for the duration of a program’s execution, regardless of the context or meaning of that name. Thus if Fred is a constant in one context, a method in another, and a class in a third, the Symbol :Fred will be the same object in all three contexts.

這段解釋定義了Symbol為一個呈現"name"與"string"的object.

再看看ri所提供的Symbol範例 :

module One
  class Fred
  end
  $f1=:Fred
end
module Two
  Fred=1
  $f2=:Fred
end

def Fred()
end

$f3=:Fred
$f1.id #=>2514190
$f2.id #=>2514190
$f3.id #=>2514190

以上面這段程式看起來,不管f1,f2,f3都指向同一個物件.
這解釋了第一個特性,每個SYMBOL都只具一個實體,"唯一性"

再來,打開irb輸入下面代碼,讓我們看看它與字串的關係.

a= :str
b= "str"
a[0]        #=> undefined method [] for :str:Symbol
b[0]        #=> 115
a.to_s[0] #=> 115
a.size      #=> undefined method size for :str:Symbol

由上面的範例,我們可以知道Symbol跟String是不一樣的.
儘管我們可以將它to_s轉為String後再進行修改,但我們無法對Symbol直接修改.
(不過.... 在Ruby 1.9已經將Symbol加入了各種String的功能,如size,length甚至是Regexp, =~ ,所以Symbol和String是越來越像了.)

那麼,Symbol到底是幹麻的?
其實大多數人拿它來當Hash的key,或是name, identifier.
也許因為效能比較好,它是唯一性的. 再加上你不管到哪都是指向同一個物件,有點類似c指標.
而且1.9以後可以直接對Symbol作操作,更提高了Symbol的功能.
Symbol的用法,如同之前所說,如果你還有其他用法或見解,請一定要告訴我,大家一起進步.

--延伸閱讀
Digging into Ruby Symbols
Yet Another Blog about Ruby Symbols
Symbols, Strings, Methods, and Variables
Symbols Are Not Immutable Strings

5Mar/090

About

這個網站寫有關Ruby On Rails及些技術的東西.