關於 web service, unity, blogger 等軟體工程筆記

Rails 初探感想與筆記

Edit icon 沒有留言
ruby-on-rails

當初買 MAC 筆電有一大部分是想要學 Ruby on Rails (ROR),終於在購買後幾個禮拜後,開始安裝 ROR 環境,開始找教學指南,開始動手做第一個 ROR Application。

關於安裝

跟隨著 railsbridge.org 所提供的教學文件 裝機趴 Installfest,文件寫得相當清楚明瞭,一步步很順利的把 ROR 環境安裝起來。

安裝的過程中,也遇到一些插曲。例如 XCode 以及 Homebrew 之前為了 Game Jam 所安裝環境中,已經存在這些程式了,因此測試環境後就跳過安裝步驟。在安裝 Git 步驟時,想起之前有安裝 SourceTree,Git GUI 版本,所以 Git 安裝也能跳過。最後是 Ruby,沒有按照文件安裝 Ruby 4.2,而改安裝 Ruby 5.0.1,心想要學習就學習最新的 Ruby 吧。當然得預先打好預防針,5.x 用 4.x 的教學步驟執行,肯定會遇到很多阻礙。

感想

隨著步驟一一執行。在處理 Git 環境中,心中是存在一種抗拒,為什麼不像 Windows 那樣,使用圖型化介面設定就好,而需要記指令一次一次輸入?理智明白知道這是某種拒絕學習新東西的心聲,想要阻止自己進入學習那種不舒服的領域,了解這時候如果順從,那可能學習就到此為止,因此壓抑著那心聲,不舒服硬著頭皮使用 git command 來完成 git 環境設定。

後續操作中盡量不管腦中冒出那些,想要搞懂為什麼要這樣做的心聲,那些都會拖累完成教學指引的進度,會使得自己花費太多精力在這些疑問上,按照教學文件做就對了。

第一次完成 Intro To Rails 的操作步驟,很順利成功把專案丟到 Heroku 這免費的雲平台測試。說實在的,完全不懂到底在做什麼。嘗試將 rails 的架構以及 ruby 的程式語法,跟腦中以前的知識串接,僅能找到一些知識可以接上。例如 MVC,從 rails 資料夾大概可以猜得出來 MVC 的資料放在哪裡。例如 Git,之前常用 TortoiseGit 圖形化介面進行 git 操作,現在得切換並且嘗試記得 git commands。

但如果要重新不看文件再做一次,肯定沒有辦法。所以又重新練習一次,一樣看著文件步驟操作,忽略那些問為什麼的想法。但第二次練習似乎沒有這麼順利,在建立 Model 時,發現有指令打錯 rails generate model vote topic_id:interger,integer 打成 interger,導致後續的指令 rake db:migrate 出錯,其錯誤訊息:

== 20160817094024 CreateVotes: migrating ======================================
-- create_table(:votes)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
undefined method `interger' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x007fcd776e6c38>
Did you mean? integer
Integer

要怎麼解決?身旁沒有助教沒有人可以詢問,只能上網問網友,或是自己找答案了。到 SoftnShare 所成立的 Slack rails 頻道詢問,同時也自己求助 Google 找答案。

什麼關鍵字可能會找到解決方案,從過往的經驗把指令 db:migrate 以及錯誤訊息關鍵字問 Google,可以較容易找到相同問題以及解答。最後找到的解決方式,是直接修改 db/migrate 下的 ruby 程式碼定義,同時也注意到板友也同時回答相同的方法,來修正這一個問題。

多做幾次,真的是能夠快速了解,各個元件指令在做什麼什麼,會產生什麼檔案結構,大致粗淺了解 ROR 架構如何,也稍稍有點成就完成一些東西。

第一次建置 App 操作筆記

遵循 Intro To Rails 教學

Git

# 初始化 Git repository
git init

# 目前的檔案狀態
git status

# 新增還未管理的檔案
git add .

# 提交一份版本,並設定版本註解
git commit -m 'my message'

# 將本地 repository 上傳到遠端 repository
git push remote master

Rails

# 新專案,名稱為 example
rails new example

# 啟動 rails 伺服器
rails server
rails s

# 產生 topic 的 MVC 資料,其結構包含兩個欄位
rails generate scaffold topic title:string description:text

# 產生 vote 的 model 資料,其結構為 topic_id 欄位
rails generate model vote topic_id:integer

# 建立 db migrate 指令 (db/migrate)
rake db:migrate

# 列出路由資料
rake routers

Models

# file: apps/models/topics.rb
# 設定資料表關聯性,擁有許多 votes 資料
has_many:votes, dependent: :destroy

# file: apps/models/votes.rb
# 設定資料表關聯性,所屬於 topic
belongs_to:topic

Views

# 根據 count 決定是否要產生多數型 (votes)
pluralize(count, `vote`)

# 產生超連結,顯示 text,連結到 url
link_to 'text', url

# 產生按鈕,顯示 text,按下連結到 url
button_to 'text’, url

Controllers

# file: apps/controllers/topics_controller.rb
# 加一票
def upvote
@topic = Topic.find(params[:id])
@topic.votes.create
redirect_to(topics_path)
end

# 減一票
def downvote
@topic = Topic.find(params[:id])
@vote = @topic.votes.first
if @vote
@vote.destroy
end
redirect_to(topics_path)
end

Routers

# file: config/router.rb
# 首頁設定
root topics#index

# 加入兩個動作,upvote & downvote
resources :topics do
member do
post ‘upvote'
post ‘downvote'
end
end

沒有留言: