Generate Model from Existing Table?

[cc lang=”ruby”]
class Person < ActiveRecord::Base set_table_name 'person' end [/cc] 如果你的rails專案是一個從別的UI準備要換皮換成Rails的,則原來己存在的資料表可以依以上的指令讓這個model用set_table_name去存取。 另外如果不想新增一個Model而又給你新增一個migrate檔,則可以用 [cc lang="ruby"] rails g model model_name --skip-migration [/cc] 來跳過產生migrate檔。 ref: 更改表格名: http://apidock.com/rails/ActiveRecord/Base/set_table_name/class
更改欄位名:
http://apidock.com/rails/Module/alias_attribute

http://stackoverflow.com/questions/4119659/rails-3how-to-generate-models-for-existing-database-tables

http://stackoverflow.com/questions/1986301/rails-generate-model-from-existing-table

另外, model class 都是以單數命名 (Ticket)

update
如果你在log遇到這個警告:
DEPRECATION WARNING: Calling set_table_name is deprecated. Please use `self.table_name = ‘the_name’` instead

表示在未來 Rails 下個新版本將不支援 set_table_name 這個方法,請這樣用:
[cc lang=”ruby”]
class Person < ActiveRecord::Base self.table_name = 'person' end [/cc]

正規表示的一些範例

如果網頁中的資料是這樣子的

[cc lang=”html”]

234234aaaa
asdasd
ssdfsdf


[/cc]

想抓取image標籤內的圖片連結值,則正規表示可寫成..
[cc lang=”ruby”]
/i
[/cc]

所取得的資料就大概是這樣
[cc lang=”bash”]
Match 1
1. “asdasdasd”
Match 2
1. “aaaaa”
Match 3
1. http://domain.com/image/110520_s065s.jpg
[/cc]

抓取a href 中的網址連結,則正規表示可寫成..
[cc lang=”ruby”]
/i
[/cc]

則抓取的資料大概像這樣
[cc lang=”bash”]
Match 1
1. http://domain.com/html/048-030.html
Match 2
1. http://domain.com/051-049.html
Match 3
1. ertre456
[/cc]

不過這個正規表示的方法仍有些問題,要跳脫雙引號就有點麻煩了。

正規表示的測試網站:http://rubular.com/

Rails 的輔助方法

許多有經驗有條理的程式設計師是很不喜歡亂到不行的程式碼。一來閱讀困難,二來在維護會很有機會吐血。
為避免上述的狀況,可以自定helper來設計輔助方法。

[cc lang=”ruby”]
module XXXXHelper
def admin?(p)
p[:user] == “AAA” and p[:passwd] == “123456” and p[:token] == “XYZ”
end
end
[/cc]

如上定義之後,樣版中(views)就可以直接:

[cc lang=”ruby”]
<% if admin? params %>
admin data here.
<% end %>
[/cc]

ruby的語法特性,特別的地方是以往我們習慣在呼叫函式會這樣做:
call function(var, var)

而現在是這樣做
function? var, var

ruby有許多新觀念的coding方法跟我之前習慣php方法差蠻多的,還在摸索~

以上 ~

Octopress 試架方法

最近圈內的人都在跟我說這最近快要頂上天的 bloging 軟體,也大概是 Ruby 圈內覺的很對味的東西,因為它是基於 Ruby 的語言,然後使用自行開發的框架而產生靜態的網頁。

特別的是它可以使用 Markdown 的語法來寫作,再經過 rake 的方法發佈成 HTML ,一切所有的一切你只需要用 vim 來寫作你的部落格就可以。

這是一個非常棒的方式,目前寫作的格式就以 Markdown 最為大家能接受,未來你的文章除了發佈成網站之外,透過源碼的修改還可以匯整成 EPUB 的方式出版至所有支援此檔案的電子書格式。

Continue reading Octopress 試架方法

Rails 3.1 error – Could not find a JavaScript runtime?

最近不小心升到 Rails 3.1 因此在建立新專案時又TMD爛掉了!?

有沒有Ruby on Rails 每次升級就爛掉的八卦?!ヽ(`Д´#)ノ ムキー!! (冒青筋

[cc lang=”bash”]
$xyz rails s
/home/XXX/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/execjs-1.2.9/lib/execjs/runtimes.rb:47:in `autodetect’: Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
[/cc]

解決方法,到Gemfile新增兩行:
[cc lang=”ruby”]
gem ‘execjs’
gem ‘therubyracer’
[/cc]

然後bundle install

總算暫時平息 〜( `д´)b オッケー!

Rails 另外命名資料表名稱的方法

若要在 Ruby on Rails 在己存在的資料庫上重新建立 UI ,並且原資料結構與資料都必需保留。但MySQL對於資料欄位名稱的大小寫非常的敏感。

因此若在Rails上命名model之後:

rails即報錯,資訊如下:

[cc lang=”ruby”]
irb(main):006:0> Tickets.first
Mysql2::Error: Table ‘rt3.tickets’ doesn’t exist: SHOW FIELDS FROM `tickets`
ActiveRecord::StatementInvalid: Mysql2::Error: Table ‘rt3.tickets’ doesn’t exist: SHOW FIELDS FROM `tickets`
[/cc]

Rails指出的錯誤是因為 tickets 字首變小寫了,所以MySQL就找不到資料表。

那麼,若以後要改寫UI不就很沒有彈性?

是的,我找不到那個方法前是非常的躁鬱的 ★゜+.ヽ(*。>Д<)o゜+.゜☆ 好佳在有前輩可以指引光明,因此前輩指出了一個方法,那就是: [cc lang="ruby"]set_table_name[/cc] 然後在這個地方放進這個方法: [cc lang="ruby"] class Tickets < ActiveRecord::Base set_table_name "Tickets" end [/cc] 結果: [cc lang="ruby"] Loading development environment (Rails 3.1.0) irb(main):001:0> Tickets.count
(2.8ms) SELECT COUNT(*) FROM `Tickets`
=> 8035
[/cc]

Rails的世界因此變的美好了 〜♡ヽ(●´ε`●)ノ♡

相關連結:
http://apidock.com/rails/ActiveRecord/Base/set_table_name/class

http://apidock.com/rails/Module/alias_attribute

Ruby on rails 簡化 Code 的方法

以前用PHP寫一個專案時,寫久了就會知道這個功能會在哪個專案重複用到最多次,為了減少未來改寫程式時所花費的時間與重覆的動作,都會另外寫一個自定義的 Function 或是 Method 。

這次跟工讀生一同用Ruby on Rails 開發一個專案,身為 Ruby 初生之贖的我都會被以往寫 PHP 的習慣而被固定住,在自己尋找最佳的開發方式,是下了不少的工夫,好在的是上個星期參加 RubyConf Taiwan 2001 讓我學到不少好東西。

雖然 Rails 的架構很好,自定義 Method 的工作是在開發專案中最常見到的事情,因此當寫到一個需要將同樣的 Code 不斷的要 copy & past 我的程式碼潔癖就會開始發作。

如何在 Rails 中自定義 Method ?

Continue reading Ruby on rails 簡化 Code 的方法

A Ruby Lightweight Web Framework : Sinatra

Sinatra 是一個輕量級的 lightning Web Framework。

Sinatra 與 Rails 主要的差別在於 Sinatra 並不是 MVC 式的 Framework。它的 core 並不包含類似 ActiveRecord 這樣的 module。通過使用 get/post action 定義,Sinatra 也同樣具備 dynamic route definition。

使用 Sinatra 的目的是搭造小型的應用程式或者API介面。這樣做的好處是如果你只是想寫一支小型程式,或者開發 API,那就並不需要使用 Rails 這麼複雜(或肥)的 Framework做這些簡單的事。

所以使用 Sinatra 既簡單,程式回應也迅速。

安裝方法:
[cc lang=”bash”]
gem install sinatra
[/cc]

使用方式如下:

[cc lang=”ruby”]
# myapp.rb
require ‘sinatra’

get ‘/’ do
‘Hello world!’
end
[/cc]

存好一個檔案,然後下指令:
[cc lang=”bash”]ruby -rubygems myapp.rb[/cc]

沒錯,這樣子就可以run了!

因此,如果還不想太早學 Rails 這樣有點復雜的MCV架構程式,你可以先從用sinatra來學你的Ruby Code 。

教學官網:http://www.sinatrarb.com/