2015年4月2日 星期四

將Rails專案佈署至Heroku

最近因為三不五時要交作業,而雖然上傳至github可以讓老師也看到程式碼,但無法直接觀看到執行結果,所以讓我們將程式佈署至Heroku,就可直接觀看執行結果,但不曉得為什麼一直佈署不成功><,先簡單敘述一下基本步驟。

安裝步驟可以參考官方指南(英文):https://devcenter.heroku.com/articles/getting-started-with-ruby#introduction
也可以參考Ralis girl guides的教學:http://railsgirls.tw/heroku/

  1. 第一步當然就是先去申請一個heroku帳號
  2. 安裝bundle,在終端機執行「gem install bundler」
  3. 安裝Heroku Toolbelt,如果是使用線上環境(例如cloud9、nitrous.io),通常都已經安裝好了
  4. 在終端機執行「heroku login」,登入你的heroku帳號
  5. 準備一個專案
  6. 將專案加到git中,在終端機執行「git init」、「echo "public/uploads" >> .gitignore」、「echo "tmp" >> .gitignore」、「echo "logs" >> .gitignore」、「git add .」、「git commit -m "initial commit"」
  7. Heroku使用的資料庫與rails預設的'sqlite'不同,所以至Gemfile中將「gem 'sqlite3'」改為
    group :development do
     gem 'sqlite3'
    end
    group :production do
     gem 'pg'
    end
    改完存檔後,在終端機執行「bundle install --without production」
  8. 安裝 rails_12factor Gem,至Gemfile中將
    group :production do
     gem 'pg'
    end
    改為
    group :production do
     gem 'pg'
     gem 'rails_12factor'
    end
    改完存檔後,在終端機執行「bundle」
  9. 在終端機執行「git commit -a -m "Added rails_12factor gem and updated Gemfile.lock"」
  10. 接下來要在heroku中創建一個新的Heroku App,在終端機執行「heroku create daybook0402」,daybook0402是我自己設定我的App要叫這個名子,如果不打的話heroku會自動指定一個名字
  11. 執行「git push heroku master」,將所有的程式碼上傳到heroku中
  12. 執行「heroku run rake db:migrate」,在遠端heroku的伺服器將資料庫建起來
  13. 執行「heroku ps:scale web=1」
  14. 執行「heroku open」
理論上來說執行完以上幾個步驟,Heroku App就可順利執行,只要打開Heroku給你的網址(像我的網址就是http://daybook0402.herokuapp.com/)就可看見執行結果。

現實總是殘酷的~~~執行完以上步驟後我的App還是跑不出來,一直出現以下訊息
原本以為是有哪一個步驟漏了,又在cloud9重新開一個新的workspace,把專案重新複製下來,又在重新執行一次以上的步驟,但還是無法執行@A@

檢查過後發現,在執行「git push heroku master」時,有出現過警告訊息
如何解決第一個警告訊息:
  1. 安裝puma
    在Gemfile中加上「gem 'puma'」,再執行bundle install
  2. 在專案資料夾之下新建一個名為「Procfile」的檔案,這個檔案裡面貼上「web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}」
  3. 執行「git add .」、「git commit -am "make it better"」、「git push heroku master」,將修改過的檔案重新推上Heroku
現在剩這個警告訊息
要解決這個警告很簡單,在Gemfile中加上ruby '2.0.0' ,' '中填的是你的ruby版本
再執行一次「git push heroku master」
在執行「heroku open」也有出現警告訊息
這個警告訊息目前我還解決不了QAQ,還在努力中,找到解決方法再來更新~~
執行「heroku logs」檢查記錄發現好像有一個錯誤
上網查過後是說需要在routes.rb中指定root,所以我在routes.rb中加上「root :to => 'costs#index'」指定一進網頁要到哪個controller(但還是無法解決heroku open的問題)

目前詢問過後知道不是我的執行步驟有問題,而是我的程式碼有錯(其實heroku logs有顯現出錯誤在哪,只是我一直沒看出來= =,在cloud9中執行是正確的,就以為我寫的是正確的)

錯在我用紅框框起來的地方,在sqlite中這個where的like條件可以執行,但是在heroku中是使用PostgreSQL ,這樣like是過不了的!(至於為什麼還沒研究出來,等星期天玩回來再來慢慢研究~~)

0408更新
將有錯的地方暫時註解起來,並修改一下,重新上傳之後,在heroku就可以正常運作了

其實like只能對字串來做比對,在sqlite中能執行是因為在sqlite內部其實都是用text在運作,所以那段where條件才過的了~

0409更新
原本「Cost.where(['buyday like ?','2015-03%'])」是錯誤的,like不能用在日期型態
改為「Cost.where(['buyday between ? and ?','2015-03-01','2015-03-31' ])」或是「Cost.where(["date_part('month',buyday) = ?" ,3])」
使用between的話可以不只計算一個月,只要調整第2個日期就可以~
使用date_part的話是取出日期的特定部分,如果想要指定年份的話再加一個and 條件「Cost.where(["date_part('month',buyday) = ? and date_part('year',buyday) = ?" ,3 , 2015])」