前情提要:

Paas(平台及服务)公司Heroku是个可以把我们写好的App部署到网际网络的好地方。而本篇是我从自己的上一篇文章:将Ruby on Rails项目部署到Heroku遇到的问题,当时困扰了快两小时,好在搜寻完解法搞定完后,就兴奋地延伸为一篇文章了!找到点子写文章果然是遇到bug的最佳副产品

 

Heroku的数据库是使用PostgreSQL,而这篇文章有说明为什么不用SQLite在Heroku。

但Rails框架在我们的电脑本机rails new app设定时,为了初学者快速理解学习,预设是SQLite。

所以如果没有变更数据库,直接把Rails push到Heroku上去,就会出现问题。

 

看完这篇数据库的文章比较,以一句话来大概解释比较sqlite与PostgreSQL,sqlite缺乏额外优化性能的灵活性,且同一时间只允许一个写入操作;可扩展的PostgreSQL提供了可靠性和数据完整性,因此是更好的选择。

 

[问题]

我在本机的Ruby on Rails项目所用的数据库是SQLite,当时还未想到之后会部署到Heroku。

 

因此,在上篇文章做到Step3 >>步骤B.建立Heroku gem:修改我的本地文件夹里的gem file,当我新增一个gem叫做'pg'这个步骤时…

 

问题出现了!本机遇到的错误讯息:No connection pool for ActiveRecord::Base

 

 

[解法]

 

Step1.修改rails项目的/config/Gemfile

Pg套件,让我们在Ruby上使用关联式数据库PostgreSQL的界面的好帮手。

(Pg套件详细数据:http://www.leafor.com

 

我们可以/config/Gemfile加上这几行代码,

让在Heroku上线时候跑的是PostgreSQL,而在本机的时候还是跑SQLite。

 

Rails应用程序预设提供了三种不同的执行模式:

development environment:开发模式,用在你的开发的时候

test environment:测试模式,用在执行测试程序时

production environment:正式上线模式,用在实际的上线运作环境

 

group:production do

gem 'pg'

end

 

group:development,:test do

gem 'sqlite3'

end

或是写成:

 

gem 'sqlite3',group::development

gem 'pg',group::production

[注意]gem 'pg'后面要加逗号,啊!不然就会向我一样出现Syntax error…

 

 

欣慰的是,用错误讯息搜寻关键字,发现在stackoverflow上也有人跟我犯过同样的错误XD

https://stackoverflow.com/questions/18684527/gemfile22-syntax-error-unexpected-tidentifier-expecting-end-of-input

 

Step2.跑bundle install,再重启rails server。

记得,每次在Gemfile修改套件数据,都要跑bundle install处理套件相依性问题。

(如果你在本机,想避免安装任何在production环境下跑的gem,可输入:bundle install --without production)

 

而每次跑完bundle都要先用control+ c关掉Terminal页面的服务器,

再重启服务器rails s之后,如下图:localhost数据库的问题已解决了:

 

 

但你还是看不到首页的数据:

 

Step3.部署到Heroku:git push heroku master

最后两步:push!git push heroku master,

还要跑完heroku rake db:migrate指令才会生效喔!

 

(如果转换数据库之前有些bug,run指令的时候会提示哪些字段可能出了问题。)

 

首页成功显示数据库!

 

 

==

后记:

遇到这个bug让我提早了解跟ruby on rails相关的数据库概念,是一个很有价值的坑(bgrayart)!

 

如果你想在本机建立rails app的当下,直接设定成PostgreSQL而非SQLite(节省之后deploy的麻烦~),可以参考这篇文章:

Rails使用PostgreSQL