Saturday, September 26, 2009

Lab 6 - Ruby on Rails

You will be creating a "scaffold" backend with "fixtures" for your database.
Do it with our example database to become familiar with the process.

Install what needs installing:
Note that the Ubuntu package manager is out of date for rails so we need to grab rubygems and rails from ruby.
sudo apt-get install vim-ruby ruby-full git-core sqlite3 sqlitebrowser mysql-server libsqlite3-dev
sudo apt-get remove rails rubygems
wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
tar xf rubygems-*.tgz
cd rubygems-*/
chmod a+x setup.rb
sudo ruby setup.rb
cd /usr/bin
sudo ln -s gem1.8 gem
cd -
sudo gem update --system
sudo gem install rails --include-dependencies
sudo gem install sqlite3-ruby
# download mysql workbench

Setup the site skeleton:
mkdir /var/webapps
sudo chown `whoami`:`whoami` /var/webapps
cd /var/webapps
rails WhatSayYe
cd WhatSayYe
git init
# Just so that these folders are not empty
touch log/.gitignore
touch doc/.gitignore
touch tmp/.gitignore
cat - > .gitignore << EOF
log/*.log
tmp/**/*
doc/api
doc/app
EOF
Create the site scaffold
# User
script/generate scaffold User email:string crypted_password:string password_salt:string persistence_token:string
  # has_many questions
  # has_many answers through results

# Question
script/generate scaffold Question url:string question:string user:references 
  # belongs_to user

# Answer
script/generate scaffold Answer answer:string question:references
  # belongs_to question

# Result
script/generate scaffold Result user:references answer:references 
  # Exclusively a join table
Instantiate the database:
rake db:create
rake db:migrate
Now establish the relationships and the label in the models:
# app/models/user.rb
class User < ActiveRecord::Base
  has_many :questions
  def to_label
    return email
  end
  def to_s
    return to_label
  end

end
# app/models/question.rb
class Question < ActiveRecord::Base
  belongs_to :user
  has_many :answers
  has_many :results, :through => :answers
  def to_label
    return question
  end
  def to_s
    return to_label
  end

end
# app/models/answer.rb
class Answer < ActiveRecord::Base
  belongs_to :question
  has_many :results
  def count
    return results.length
  end
  def to_label
    return answer
  end
  def to_s
    return to_label
  end
end
# app/models/result.rb
class Result < ActiveRecord::Base
  belongs_to :user
  belongs_to :answer
  def to_label
    return "#{user} chose '#{answer}'"
  end
  def to_s
    return to_label
  end
end
Create 'fixtures' of sample data
# test/fixtures/users.yml
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
coolaj86:
  email: coolaj86@nomail.com
bretswan:
  email: bret.swan@nomail.com
# test/fixtures/questions.yml
everything:
  url: "everything"
  question: "What is the answer to Life, the Universe, and Everything?"
  user: coolaj86

swallow:
  url: "swallow"
  question: "What is the average airspeed velocity of an unladen swallow?"
  user: bretswan
# test/fixtures/answers.yml
love:
  answer: "to love"
  question: everything

forty_two:
  answer: "42"
  question: everything

learn:
  answer: "to learn"
  question: everything

meters:
  answer: "11 meters per second"
  question: swallow

miles:
  answer: "24 miles per hour"
  question: swallow

species:
  answer: "African or European swallow?"
  question: swallow

coconut:
  answer: "It's not a question of velocity! It's a simple question of weight ratios! A five ounce bird could not carry a one pound coconut."
  question: swallow
# test/fixtures/results.yml
swallow_1:
  user: coolaj86
  answer: species

swallow_2:
  user: bretswan
  answer: coconut

everything_1:
  user: coolaj86
  answer: forty_two

everything_2:
  user: bretswan
  answer: forty_two
Now it should be fair to give it a test run:
rake db:fixtures:load
script/server
# view at http://localhost:3000/users
# view at http://localhost:3000/questions
# view at http://localhost:3000/answers
# view at http://localhost:3000/results
Switch to Active Scaffold
cd /var/webapps/WhatSayYe
script/plugin install git://github.com/activescaffold/active_scaffold.git
script/plugin install git://github.com/ewildgoose/render_component.git -r rails-2.3
#http://activescaffold.com/
#
# This must be added to each of the following
#
# app/views/layouts/users.html.erb
# app/views/layouts/questions.html.erb
# app/views/layouts/answers.html.erb
# app/views/layouts/results.html.erb
<%= javascript_include_tag :defaults %>
<%= active_scaffold_includes %>

#
# Replace your controllers like so
#
# app/controllers/users_controller.rb
class UsersController < ApplicationController
  active_scaffold :user do |config|
    config.columns.exclude :created_at
    config.columns.exclude :updated_at
    config.columns.exclude :password_salt
    config.columns.exclude :crypted_password
    config.columns.exclude :persistence_token
  end
end

# app/controllers/questions_controller.rb
class QuestionsController < ApplicationController
  active_scaffold :questions do |config|
    config.columns.exclude :created_at
    config.columns.exclude :updated_at
  end
end

# app/controllers/answers_controller.rb
class AnswersController < ApplicationController
  active_scaffold :answer do |config|
    config.columns.exclude :created_at
    config.columns.exclude :updated_at
  end
end

# app/controllers/results_controller.rb
class ResultsController < ApplicationController
  active_scaffold :result do |config|
    config.columns.exclude :created_at
    config.columns.exclude :updated_at
  end
end
We'll cover the MySQL setup in lab.
In progress... still...
* setup mysql
* switch to mysql with the diagram
* customize active scaffold
* create jsonic web service
* create 3.0 web app
* switch as to admin backend
* switch webapp to frontend


#script/plugin install git://github.com/activescaffold/active_scaffold.git

#http://railscasts.com/episodes/81-fixtures-in-rails-2-0
# Fixtures

No comments:

Post a Comment