A little engineering on Rails Robert W. Hasker Goals • Intro to the Rails framework ▫ Basic concepts: MVC, Active Record ▫ A bit of Ruby • Using Rails to build a website • Myths and issues The Rails Framework • Basic goal: construct database-backed websites • Multi-platform: popular OS’s, database engines • Origins: ▫ Instiki by David Heinemeier Hansson ▫ Basecamp by 37signals ▫ Rails: domain-independent core • Built on the Ruby language ▫ General-purpose language: scripting, applications ▫ Dynamically typed, “open” classes Basic Concept: MVC • Issue: how to separate logic from presentation? • Classic solution: Model/View/Controller ▫ Model: domain-level data ▫ View: how the data is presented to the user Typically want multiple views ▫ Controller: logic linking the two • Rails ▫ Model ▫ View ▫ Controller = tables in a relational database = web pages = controller Basic Concepts: Active Record • Relational Databases: organize large amounts of data ▫ Issue: no easy mapping to object-oriented design • Active Record Pattern ▫ ▫ ▫ ▫ A design pattern first described by Martin Fowler Object = table row w/ attributes stored as columns Table = collection of objects OOD = database (collection of tables) Rails: link classes through id fields in tables Active Record Example • Data for a simple voting system: • As tables: ▫ create table questions (id int, body text, start datetime, end datetime, primary key(id)); ▫ create table voters (id int, username text, password text, primary key(id)); ▫ create table vote_records (voter_id int, …); • Benefit: can add operations as needed - active records Using rails to build a voting application • See http://www.uwplatt.edu/csse/tools/ruby/rails/rails-demo.html Conclusion • Rails: quick OO websites ▫ MVC: sound organization ▫ ActiveRecord: support good OO designs Focus on relationships, not queries Less likely to forget a join, but supports full SQL Not shown: does support inheritance Navigation: keep the class diagram close at hand! Conclusion… • Design ▫ ▫ ▫ ▫ ▫ DRY: don’t repeat yourself Convention, not configuration Relationships are declared explicitly Scaffolding: quick data entry (prototyping only) Great development environment has full debugging support; separate dev/prod db’s ▫ Supports JavaScript/Ajax/etc. Explore Ajax support next time Myths & Issues • Myth: slow sites, doesn’t scale ▫ Supports many web servers ▫ Many optimizations probably belong elsewhere ▫ Technology improving • Myth: only for specific types of projects ▫ ▫ ▫ ▫ Source: lots of simple examples out there Can handle big problems Don’t have to involve a database See http://wiki.rubyonrails.org/rails/pages/RealWorldUsagePage1 • Issues ▫ Active Records: should have Table classes ▫ Ruby: run-time type checking requires lots of testing! But has good built-in testing support! ▫ Developers tempted to use all – pick level and stick to it Resources • Online tutorials • Classic text: Agile Web Development with Rails • Starting points: ▫ http://guides.rubyonrails.org/getting_started.html ▫ Beginning Rails: From Novice to Professional In library, but based on Rails 1.x ▫ Beginning Rails 3 Available soon • More detail: The Rails Way