有陣時間沒寫Code,就算臨時要寫,通常是用.Net 3.5 / Web form的架構就乎巄過去
最近,聽到朋友公司準備改用Ruby on Rails (以下簡稱RoR) 為基礎開發網站架構,卻意外點燃了我的好奇心
前端 : RoR + JQuery + Bootstrap
後端 : RoR + MySQL
參考來源是Ruby on Rails 實戰聖經,作者是張文鈿
除了是個資深高手,更是RubyConf Taiwan來自於大會的主辦人
網址 : http://ihower.tw/rails3/index.html
不過說也奇怪,照著做的過程中,總是會漏掉一些細節
跑起來總是會有些意想不到的錯誤跟疑惑
在此,分享一些我遇到的狀況,希望讓你少花點時間找資料 😀
開發環境
– Windows 7 64 bit – EN
– http://railsinstaller.org/en 全自動安裝最適合新手了…..XD
- 打錯名稱,怎移除 / 刪除自動產生的Model / View / Controller ?
MVC架構,不外乎就是會產生Model、View、Controller
rails generate controller #NAME [action action] [options]
這類的語法,可以分別產生M、V、C。也因為這是自動產生,他會一併產生3~4個檔案。打字打太快,難免會打錯字,這麼多個檔案,要刪除也蠻累。還好,有個逆向的指令可以運用,剛自動產生的那些檔案,它都會一併移除。
rails destroy controller #NAME
- Partial Template 要放在哪個資料夾?
.Net 有Masterpage,可以把一些共用的畫面做成一個樣板,需要使用的頁面可以自由採用。在RoR中,系統預設會去找View共用的樣板套用
appviewslayoutsapplication.html.erb
但是,如果需要針對樣板再進一步客製化,就必須要使用到Partial Template的概念
有幾個特點
– 在沒有改路徑,或設定共用的情況下,都是直接放在Views底下,個別資料夾內
– 命名習慣是在檔案前面加”_”底線,可以有很多個同時存在
– 有變數的情況下,可以透過 : locals 傳入
<%= render :partial => ‘form’, :locals => { :f => f } %>
– 沒變數的情況下,可以直接引用
<%= render :partial => ‘header’ %>
– 路徑放錯,你可能會看到下面這段錯誤訊息
ActionView::MissingTemplate in XXXXX#XXXX
- Public資料夾有一些404.html / 422.html / 500.html 哪時候會用到?
內,看到這三種檔名開頭的資料,RoR預設把不同狀態都切開,也因此,你在test狀態,
其實是看不到上面那些錯誤網頁的轉址。同時,rails server這個指令,預設是開
啟development 模式,所以除了要改預設值外,也可以透過下述指令執行才切換。
rails server -e production
- Incorrect MySQL client library version! This gem was compiled for 6.0.0 but the client library is 5.0.27. (RuntimeError)
ref : http://stackoverflow.com/questions/8740868/mysql2-gem-compiled-for-wrong-mysql-client-libraryref : http://dev.mysql.com/get/Downloads/Connector-C/mysql-connector-c-noinstall-6.0.2-win32.zip/from/pick
這純粹是因為MySQL library版本不同所導致,最快的方法如參考網址的解答所顯示,請
下載第二個連結的壓縮檔,解開把liblibmysql.dll放到你自己的資料夾內。
我的路徑是這個C:RailsInstallerRuby1.9.3bin
- 如何新增套件?
Ruby on Rails這點有像以前在玩Ubuntu,它有套件庫的概念,想用的功能跟框架,大多可以找到相關的套件。開啟資料夾根目錄,有個Gemfile檔案,就是用來管理的設定檔。其
中,第一條直接寫明,套件庫的參考路徑是來自於這邊source ‘https://rubygems.org’
接著,你可以直接連到這網站去,去查詢它所支援的套件,最簡單,就是直接打一個
關鍵字去查。 ex MySQL通常,它會跳很多相似的套件名稱,最簡單,就是挑一個名稱最相配。除此之外,直
接看下載量,也不失為一個好方法 XD找到套件後,直接點進去,一定會先看到安裝路徑 gem install mysql 及這套件的相關資
料。最重要的是,記得養成習慣,把Gemfile的指令加進去檔案內。
ex gem “mysql”, “~> 2.9.1”如果一次加入很多條,建議直接執行bundle install取代gem install xxxxx。
– MySQL套件
gem “mysql”, “~> 2.9.1” / gem “mysql2”, “~> 0.3.13”
– Bootstrap套件
gem ‘bootstrap-sass’
– 資料庫備份套件(支援SQLite、MySQL)
gem ‘yaml_db’
- 如何把資料庫從SQLite轉移到MySQL上?
剛開始建立專案的時候,系統預設使用SQLite當作練習。通常,除了手機端會使用
SQLite當作正式資料庫以外,大部分的網站主機,都會額外連結MySQL、MSSQL、Oracle、No SQL之類的資料庫伺服器,以承受更大量的資料操作使用。
通常,如果資料結構沒有太複雜的設定,或者是已經建立了一些測試資料,希望搬到正式的資料庫伺服器上測試,可以透過yaml_db來進行資料的備份及轉移。
rake db:data:dump -> Dump contents of Rails database to db/data.yml
rake db:data:load -> Load contents of db/data.yml into the database1.
rake db:dump
2. Edit config/database.yml and change your adapter to mysql, set up database params
3. mysqladmin create [database name]
4. rake db:load套件的使用說明,已經交代了一些常用的指令及從SQLite要搬移到MySQL的
技巧。簡單的說就是備份SQLite > 連線改到MySQL > 在MySQL建資料庫 > 讀備份。完成操作,你就可以在MySQL內,看到你的資料表跟資料,已經被轉移過來。
如果你跟我一樣懶,可以考慮把第三條改成下面XD3. rake db:create:all
依據你連線設定的資料庫名稱,自動幫你到MySQL建立資料庫,另外,如果不
加all這參數,production環境的資料庫不會被建立 ( 系統預設 ) 。
ps. rake db:dump 指令預設”只會”把你目前執行環境,所對應的資料表備份 !!
ex rails server ,rake db:dump => 備份dbdevelopment.sqlite3 這個資料庫到data.yml。
- Migrations的用法
ref : http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
通常,因為系統功能的增加/整合,常會需要調整DB Schema,常見的問題包含新增/刪除資料表、新增/刪除欄位、資料整批異動。以往,負責資料庫管理的人,都需要把每一次的異動記錄下來,確保將來追朔的時候,知道各版本之間的差異,特別是在客戶端系統 “上線後” 的更新,以免因為異動沒做完全,導致程式端的錯誤。
rails g migration xxxxxxx
在RoR,每次資料庫異動前,建議建立1個migration檔案,在檔案裏面敘述,你想要做那些操作,方便將來追朔使用。
ex create_table(name, options)、add_column(table_name, column_name, type, options)
為了方便版本管理,RoR會自動在migration檔案前面,新增一個時間戳記(UTC格式),讓你的檔案結構看起來如同下圖一般,明確知道是哪個時間點設定的。
因為時間點的設定,當資料庫在更新過程中發生異常,你可以靠指定版本的方式,將資料庫結構回朔到任何一個時間點的版本(不包含資料,這邊僅考慮結構)
rake db:migrate VERSION=X
指令的X就是時間戳記,所以上述的指令,套用真實資料,就變成這樣
rake db:migrate version=20130827092251
我在20130904044155_add_status_to_events2.rb 中,新增一個status欄位到events資料表內,當我指定回20130827092251這個版本,status欄位會自動被刪除。
補充 : Migrations的版本資訊不僅會以檔案形式呈現,更會在資料庫中的schema_migrations
待續…..
Cool