If you haven’t installed ruby, follow this post

Part 1: Installation and Configuration (Rails and Passenger)

  1. 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/
  1. Install rails. Download from ruby-forge. Link?
gem install -V rails-2.3.3.gem
gem install -V mysql
  1. 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>
  1. 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
  1. Restart Apache to take the new configuration
sudo /Library/StartupItems/Apache2/Apache2 restart
  1. 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.

rails.png

Part 2: Rails Development
MySQL Prerequisites:

GRANT ALL PRIVILEGES ON *.* TO rupert@'%' IDENTIFIED BY '*************' WITH GRANT OPTION;
$ mysql -u rupert -p
  1. 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)
  1. Launch Textmate
cd /Users/rupert/projects/rails/travelsiteph
mate .
  1. 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
  1. 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
  1. 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) ================================
  1. 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
  1. Add a list function to Poi Controller
class PoiController < ApplicationController
  def list
    @pois = Poi.find(:all)
  end
end
  1. Lets test. Open a browser and point to http://127.0.0.1:3000/travelsiteph/poi/list
$ruby script/server
  1. 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

  1. set RAILS_ENV to production
export RAILS_ENV=production
  1. Make sure to populate the database in production mode, run rake db:migrate

  2. 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" *