在Heroku上搭建自己的Tiny URL

随着Twitter的风行,TinyURL服务的需求也被挖掘了出来。虽然这个服务器的盈利模式仍然是一个未知数,但是并不能阻止它的流行.网上应用最广泛的的包括tinyurl.com,bit.ly等等。Source TechcrunchSource TechCrunch.

最近读到一篇不错的blog:Clone TinyURL in 40 lines of Ruby code. 这篇blog的作者用短短40行代码就实现了tinyurl的服务,大为感慨地同时让我对ruby越来越喜欢了.

get '/' do haml :index end
post '/' do
uri = URI::parse(params[:original])
raise "Invalid URL" unless uri.kind_of? URI::HTTP or uri.kind_of? URI::HTTPS
@url = Url.first(:original => uri.to_s)
@url = Url.create(:original => uri.to_s) if @url.nil?
haml :index
end
get '/:snipped' do redirect Url[params[:snipped].to_i(36)].original end
error do haml :index end

基于DSL的Sinatra Framework. 接触的不多。不过用在这种比较简洁的应用中真的非常直观好用。
params[:snipped].to_i(36)
Ruby方便的实现了数字的三十六进制(0-9,a-z)也是这段代码的亮点之一.


DataMapper.setup(:default, ENV['DATABASE_URL'] || 'mysql://root:root@localhost/snip')
class Url
include DataMapper::Resource
property :id, Serial
property :original, String, :length => 255
property :created_at, DateTime
def snipped() self.id.to_s(36) end
end

DataMapper简化下的数据持久化.好用也就是一个字啊。


__END__
@@ layout
!!! 1.1
%html
%head
%title Snip!
%link{:rel => 'stylesheet', :href => 'http://www.w3.org/StyleSheets/Core/Modernist', :type => 'text/css'}
= yield
@@ index
%h1.title Snip!
- unless @url.nil?
%code= @url.original
snipped to
%a{:href => env['HTTP_REFERER'] + @url.snipped}
= env['HTTP_REFERER'] + @url.snipped
#err.warning= env['sinatra.error']
%form{:method => 'post', :action => '/'}
Snip this:
%input{:type => 'text', :name => 'original', :size => '50'}
%input{:type => 'submit', :value => 'snip!'}
%small copyright ©
%a{:href => 'http://blog.saush.com'}
Chang Sau Sheong
%br
%a{:href => 'http://github.com/sausheong/snip'}
Full source code

HAML简化下的html模板.第一次看到html写成了code一般。好坏暂且不计,ruby就是牛啊。

看完以后当然就是自己搞一把,heroku现在也支持sinatra了,强强组合,不用不爽快。-,-
Step 1 下载Snip源码
git clone git://github.com/sausheong/snip.git.
一共就两个文件.基于Rack的配置文件config.ru和主程序snip.rb,简单明了,一目了然.

Step 2 上传至Heroku

heroku create yourapp
git push heroku master


另外一个属于ruby on rails的奇迹Heroku,就是这么喜爱.

Step 3 数据初始化

heroku clone
Ruby console for snip.heroku.com
>> DataMapper.auto_migrate!
=> [Url]

OK,搞定了,属于你自己的tiny url service.
我的Tiny URL: http://tinyurl.8gfriends.com,欢迎使用^@^

 

在Heroku上部署Radiant

Heroku:非常赞的RoR服务提供商(服务好,还免费)
Radiant:基于RoR的开源CMS。
Step 1:
sudo gem install radiant
Radiant很体贴的已经做成了gem.直接安装就可以用了。
如果要查看具体的实现可以在radiant gem的文件夹下找到。
Step 2:
radiant –database sqlite mycms
类似Rails,直接使用这条命令就可以生成整个项目文件。支持各种主流数据库。
Step 3:
cd mycms;rake db:bootstrap
使用rake初始化数据。如果数据库配置不是默认的话需要自己手动修改config/database.yml
Step 4:
将config/environment.rb中的配置修改成如下内容
config.action_controller.page_cache_directory = “#{RAILS_ROOT}/tmp/cache
Radiant会缓存生成的内容页面。Heroku的文件系统权限和默认的不一样,所以要做如上修改。
Step 5:
git init
建立Git版本文件。
Step 6:
在项目根目录下建立新文件–.gems
rspec –version 1.2.2
radiant –version 0.7.1
Heroku的特色,在git push的时候会根据这个文件安装你需要的gems.体贴温馨。
Step 7:
git add .
git commit -m “init”
提交初始项目文件。
Step 8:
heroku create <yourapp>
在Heroku上建立你的系统。yourapp就是你的网站域名。
之后可以根据yourapp.heroku.com对系统进行访问。
Step 9
git push heroku master
提交文件至Heroku Git服务器。
第一次提交需要建立master作为Branch名,以后可以直接通过git push heroku进行提交。
Step 10
heroku db:push
将本地的数据库内容提交至你的Heroku数据库。
需要Heroku 0.6.1以后的版本,如果你没有这个功能,请升级Heroku gem版本。
OK了。访问<yourname>.heroku.com.你的CMS就这样搭建成功了。
Tips 1:
Radiant需要另外两个gem:cucumber和hoe.
在windows下会有提示,在Linux下则会顺利安装,但是Step2的时候会报如下错误。
Missing the Radiant gem. Please `gem install -v= radiant`, update your RADIANT_GEM_VERSION setting in config/environment.rb for the Radiant version you do have installed, or comment out RADIANT_GEM_VERSION to use the latest version installed.
卸载radiant,安装cucumber,hoe后重新安装radiant就可以了。
Tips 2:
理论上Heroku支持各种数据库。
但是Radiant使用mysql安装的话,在Step 10会报错Internal Error.反正Heroku本省使用Postgresql,所以一开始安装的时候还是老实使用sqlite3比较好。

 

最近看到的Ruby on Rails 应用

github
http://github.com/
基于RoR的Git hosting.
由于Rails将项目迁移过去而名声鹊起.
介绍参考
GitHub – 基于Rails的Git库托管

lighthouse
http://lighthouseapp.com/
基于RoR的需求问题跟踪系统.
同样由于Rails将Bug,Feature跟踪迁移过去而名声鹊起.
没有中文参考….

heroku
http://heroku.com/
基于RoR的虚拟主机服务提供商.
基于Amazon的EC2服务.
最近获得风投300万美金而成为了RoR项目成功的又一代表.
Heroku: Ruby on Rails服务商得到300万美金投资

 

无觅相关文章插件,快速提升流量