If you haven’t installed ruby, follow this post
Part 1: Installation and Configuration (Rails and Passenger)
- Upgrade existing ruby gems
sudo gem list
sudo gem update --system
|
UPDATE: Took me 4 hours figuring this out. There was a problem when i run script/console that it will say the “gem” detected was 1.0.1 although the current gem version is 1.3.5 after gem update –system. Google didn’t helped out. But I was able to nail down the problem from this post:
https://wincent.com/wiki/Upgrading_to_RubyGems_1.0.1_on_Mac_OS_X_10.5.1
In the post above, notice that rubygems 1.0.1 was installed in /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin. I guess this gem was being referenced first before the actual /usr/local/bin/gem. So I deleted this directory /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr.
Possible sources of gem installations:
/Users/rupert/.gem/ruby/1.8/gems
/Library/Ruby/Gems/1.8/gems
|
rupert:1.8 rupert$ gem env
RubyGems Environment:
- RUBYGEMS VERSION: 1.3.5
- RUBY VERSION: 1.8.6 (2008-08-08 patchlevel 286) [i686-darwin9.5.0]
- INSTALLATION DIRECTORY: /usr/local/lib/ruby/gems/1.8
- RUBY EXECUTABLE: /usr/local/bin/ruby
- EXECUTABLE DIRECTORY: /usr/local/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86-darwin-9
- GEM PATHS:
- /usr/local/lib/ruby/gems/1.8
- /Users/rupert/.gem/ruby/1.8
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- http://gems.rubyforge.org/
|
- Install rails. Download from ruby-forge. Link?
gem install -V rails-2.3.3.gem
gem install -V mysql
|
- Install and configure passenger for Apache2
gem install -V passenger
cd /Users/rupert/.gem/ruby/1.8/gems/passenger-2.2.5/bin
passenger-install-apache2-module
|
469 LoadModule passenger_module /Users/rupert/.gem/ruby/1.8/gems/passenger-2.2.5/ext/apache2/mod_passenger.so
470 PassengerRoot /Users/rupert/.gem/ruby/1.8/gems/passenger-2.2.5
471 PassengerRuby /usr/local/bin/ruby
472
473 <VirtualHost *:80>
474 RailsBaseURI /rails/travelsiteph
475 </VirtualHost>
|
- Create a sample rails project (“travelsiteph”) in your project directory (“/Users/rupert/projects/rails”).
$ cd /Users/rupert/projects/rails
$ rails travelisteph
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
.....
$ ls -la travelsiteph
drwxr-xr-x 15 rupert admin 510 2 Sep 21:14 .
drwxr-xr-x 5 rupert admin 170 30 Sep 16:31 ..
-rw-r--r-- 1 rupert admin 10011 2 Sep 21:14 README
-rw-r--r-- 1 rupert admin 307 2 Sep 21:14 Rakefile
drwxr-xr-x 6 rupert admin 204 2 Sep 21:14 app
drwxr-xr-x 9 rupert admin 306 2 Sep 21:14 config
drwxr-xr-x 4 rupert admin 136 2 Sep 21:18 db
drwxr-xr-x 3 rupert admin 102 2 Sep 21:14 doc
drwxr-xr-x 3 rupert admin 102 2 Sep 21:14 lib
drwxr-xr-x 6 rupert admin 204 2 Sep 21:14 log
drwxr-xr-x 11 rupert admin 374 2 Sep 21:14 public
drwxr-xr-x 11 rupert admin 374 2 Sep 21:14 script
drwxr-xr-x 8 rupert admin 272 2 Sep 21:55 test
drwxr-xr-x 6 rupert admin 204 2 Sep 22:07 tmp
drwxr-xr-x 3 rupert admin 102 2 Sep 21:14 vendor
|
I have /wwwroot as my document WebRoot. Its running cf, php and mapserv (cgi-bin). Since I want to mix it with rails development, I’ll just make a rails subdirectory. Inside the rails subdirectory, I can create symbolic links to my rails applications located in my projects directory. This way, rails configuration is not exposed from Apache.
cd /wwwroot
mkdir rails
ln -s /Users/rupert/projects/rails/travelsiteph/public travelsiteph
$ ls -la
total 8
drwxr-xr-x 3 rupert admin 102 2 Sep 14:09 .
drwxrwxr-x 60 root admin 2040 2 Sep 14:08 ..
lrwxr-xr-x 1 rupert admin 42 2 Sep 14:09 travelsiteph -> /Users/rupert/projects/rails/travelsiteph/public
|
- Restart Apache to take the new configuration
sudo /Library/StartupItems/Apache2/Apache2 restart
|
- Open http://127.0.0.1/rails/travelsiteph/
But for development purposes, it is better to use http://127.0.0.1:3000/ to see immediately any changes in code.
Part 2: Rails Development
MySQL Prerequisites:
GRANT ALL PRIVILEGES ON *.* TO rupert@'%' IDENTIFIED BY '*************' WITH GRANT OPTION;
$ mysql -u rupert -p
|
- Create three databases:
mysql> CREATE DATABASE travelsiteph_development;
Query OK, 1 ROW affected (0.00 sec)
mysql> CREATE DATABASE travelsiteph_test;
Query OK, 1 ROW affected (0.00 sec)
mysql> CREATE DATABASE travelsiteph_deployment;
Query OK, 1 ROW affected (0.00 sec)
|
- Launch Textmate
cd /Users/rupert/projects/rails/travelsiteph
mate .
|
- Edit database.yml
development:
adapter: mysql
database: travelsiteph_development
username: root
password: xxxxxxx
host: localhost
test:
adapter: mysql
database: travelsiteph_test
username: root
password: xxxxxxx
host: localhost
production:
adapter: mysql
database: travelsiteph_deployment
username: root
password: xxxxxxx
host: localhost
|
- Generate a Poi model. The model should be capitalized and singular.
$ ruby script/generate model Poi
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/poi.rb
create test/unit/poi_test.rb
create test/fixtures/pois.yml
create db/migrate
create db/migrate/20090902111538_create_pois.rb
|
- Now let’s create the database table for Poi using migrations.
class Poi < ActiveRecord::Migration
def self.up
create_table :pois, :id => :poi_id do |t|
t.column :name, :string
t.column :full_address, :string
t.column :location, :string
t.column :get_there, :string
t.column :short_description, :string
t.column :full_description, :text
t.column :other_info, :text
t.column :tel_no, :string
t.column :fax_no, :string
t.column :mobile_no, :string
t.column :email, :string
t.column :website, :string
t.column :other_contact_details, :text
t.column :longitude, :decimal, :precision => 10, :scale => 7
t.column :latitude, :decimal, :precision => 10, :scale => 7
t.column :created_at, :timestamp
t.column :updated_at, :timestamp
t.timestamps
end
end
def self.down
drop_table :pois
end
end
|
$ rake db:migrate
(in /Users/rupert/projects/rails/travelsiteph)
== CreatePois: migrating =========================================
-- create_table(:point_of_interests, {:id=>:poi_id})
-> 0.0353s
== CreatePois: migrated (0.0362s) ================================
|
- Generate a Poi controller.
$ script/generate controller Poi
exists app/controllers/
exists app/helpers/
create app/views/poi
create test/functional/
create test/unit/helpers/
create app/controllers/poi_controller.rb
create test/functional/poi_controller_test.rb
create app/helpers/poi_helper.rb
create test/unit/helpers/poi_helper_test.rb
|
- Add a list function to Poi Controller
class PoiController < ApplicationController
def list
@pois = Poi.find(:all)
end
end
|
- Lets test. Open a browser and point to http://127.0.0.1:3000/travelsiteph/poi/list
- Now create the view list.rhtml in views/poi/
<% if @pois.blank? %>
<p>There are currently no pois in the system. </p>
<% else %>
<p>These are the pois in the system: </p>
<ul>
<% @pois.each do |poi| %>
<li><%= link_to poi.name, {:action => 'show', :id => poi.id} -%></li>
<% end %>
</ul>
<% end %>
|
Part 3: Deploying
- set RAILS_ENV to production
export RAILS_ENV=production
-
Make sure to populate the database in production mode, run rake db:migrate
-
Capistrano
set :port, 2210
set :application, "halalan2010"
#set :repository, "svn+ssh://2rmobile.com/data/repos/web/rails/halalan2010/"
set :repository, "http://2rmobile.com/repos/web/rails/halalan2010/"
set :scm, :subversion
set :scm_username, 'rupert'
set :scm_password, proc{Capistrano::CLI.password_prompt('SVN pass:')}
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
role :web, "2rmobile.com" # IP Your HTTP server, Apache/etc
role :app, "2rmobile.com" # This may be the same as your `Web` server
role :db, "2rmobile.com", :primary => true # This is where Rails migrations will run
#role :db, "your slave db-server here"
set :user, "rupert"
set :runner, "rupert"
set :deploy_to, "/opt/rails/#{application}"
# If you are using Passenger mod_rails uncomment this:
# if you're still using the script/reapear helper you will need
# these http://github.com/rails/irs_process_scripts
namespace :deploy do
task :start do
run "/etc/init.d/apache2 start"
end
task :stop do
run "/etc/init.d/apache2 stop"
end
task :restart, :roles => :app, :except => { :no_release => true } do
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
end
task :production do
run "export RAILS_ENV=production"
end
end
namespace :db do
task :seed do
run "cd #{deploy_to}/current && RAILS_ENV=production rake db:seed"
end
task :populate do
run "cd #{deploy_to}/current && RAILS_ENV=production rake db:populate"
end
end
|
Capistrano commands I normally use:
#on local
#cap deploy:setup
#on remote and change owner and permissions of project
sudo chown -Rf rupert:root halalan2010
#on local
#cap deploy
#cap db:seed
#cap db:populate
|
Part 4: Miscellaneous
1. Get a description or rake commands
rake -D db
2. How to populate the database in production mode?
rupert:halalan2010 rupert$ export RAILS_ENV=production
rupert:halalan2010 rupert$ rake db:migrate
(in /Users/rupert/projects/rails/halalan2010)
== CreateDatabase: migrating =================================================
-- create_table(:candidates)
-> 0.0036s
-- create_table(:voters)
-> 0.0031s
-- create_table(:votes)
-> 0.0027s
== CreateDatabase: migrated (0.0100s) ========================================
|
http://blog.airbladesoftware.com/2009/4/10/avoid-typing-rails_env-all-the-time
3. Uninstall specific gem version
gem uninstall activesupport -v 2.2.2
4 Add a source to gem
rupert:rails rupert$ sudo gem sources -a http://gems.github.com
http://gems.github.com added to sources
5. Adding a rails project in svn
#create a remote dir
svn mkdir http://www.2rmobile.com/repos/web/rails/virginmobilechecker
#checkout and copy all files
cd ~/projects/rails
mv virginmobilechecker virginmobilechecker_old
svn co "svn+ssh://2rmobile.com/data/repos/web/rails/virginmobilechecker" virginmobilechecker
mv virginmobilechecker_old/* virginmobilechecker/
cd virginmobilechecker
svn add *
#ignoring log files
svn revert log/*
svn propset svn:ignore "*.log" log
svn propset svn:ignore "*" tmp
svn propset svn:ignore "*" doc
#commit the files
svn commit -m "first commit" *
|