1 / 45

Web Science Stream

Web Science Stream. Models, Views and Controllers. Case Study: digg. Creating our shovell application. rails shovell. Generating our model. To generate a new data model for our application we’ll use the comand below Our Story model will get two attributes Name Link

emilia
Télécharger la présentation

Web Science Stream

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Web Science Stream Models, Views and Controllers

  2. Case Study: digg

  3. Creating our shovell application rails shovell

  4. Generating our model • To generate a new data model for our application we’ll use the comand below • Our Story model will get two attributes • Name • Link • String is a type which holds up to 255 alphanumeric characters • cd shovell • ruby script/generate model Story name:string link:string

  5. The output should be ... • exists app/models/ • exists test/unit/ • exists test/fixtures/ • create app/models/story.rb • create test/unit/story_test.rb • create test/fixtures/stories.yml • create db/migrate • createdb/migrate/20091019052909_create_stories.rb

  6. Let’s look at the output • story.rb • In the app/model • Creates a blank ActiveRecord • story_test.rb • Automatically generated unit testing • stories.yml • Helps our unit testing and is called a Fixture • Fixtures are files containing simple data for unit testing purposes • 20091019052909_create_stories.rb • A migration file

  7. YAML • Lightweight format to represent data • Has the .yml extension • Have a look at the test/fixtures/stories.yml

  8. stories.yml • # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html • one: • name: MyString • link: MyString • two: • name: MyString • link: MyString

  9. stories.yml • # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html • one: • name: My web site • link: http://abc.net • two: • name: Other web site • link: http://www.theotherwebsite.com

  10. I’m going to Migrate! • Migration files • Used to make modifications to the database schema • All through Ruby code • No SQL needed • Files are numbered so they can be executed sequentially • They are executed in order • Located in the db/migrate dir

  11. 20091019052909_create_stories.rb • class CreateStories < ActiveRecord::Migration • def self.up • create_table :stories do |t| • t.string :name • t.string :link • t.timestamps • end • end • def self.down • drop_table :stories • end • end

  12. Let’s do a small modification • Change • create_table :stories do |t| • To • create_table :stories, :force =>true do |t| • Useful if we already have some table structures defined in the database

  13. Let’s make our migrate • rake is based upon the C make tool • Very versatile and allows us to do a number of things ... • Try • rake –T • In our example we’ll make the migration by invoking • rake db:migrate

  14. rake db:migrate • Checks the database for the most recent migration • Steps through the migrations that have not been applied • For each migration execute the up method

  15. The output == CreateStories: migrating ================== -- create_table(:stories) -> 0.0040s == CreateStories: migrated (0.0050s) ========= • If it is successful we will find a stories table in our shovell database

  16. Rolling back • rake db:migrate version=n • Eg: undo all the tables in the database by invoking: • rake db:migrate version=0

  17. Playing with the data • Open a rails console • ruby script/console

  18. Creating our first record • s = Story.new • s.name = “My new website” • s.link = “http://abc.net” • s.save • The end result should be • => true

  19. More on records ... • To see the record id • s.id • To check if its a new record • s.new_record? • To check the number of Stories in the DB • Story.count • Another way of creating records • Story.create( :name => ‘Abc’, :link => ‘http://www.mysite2.com’)

  20. Retrieving records • Story.find(2) • Story.find(:all) • Story.find(:all).last • Story.find(:first, :order => ‘id DESC’)

  21. Dynamic finders ... • Story.find_by_name(‘Abc’) • How would we find the link ‘http://abc.net’? • Try it ...

  22. Let’s update • s = Story.find_by_name(‘Abc’) • s.name = ‘Abcd’ • s.save

  23. Let’s update and save in just one step • s = Story.find_by_name(‘Abcd’) • s.update_attribute :name. ‘Abcde’

  24. Bye Bye records • s.destroy • Try to find the record ... what’s the message?

  25. What about SQL? • Have a look at • log/development.log • CREATE TABLE "stories" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "link" varchar(255), "created_at" datetime, "updated_at" datetime

  26. Generating our first controller! • ruby script/generate controller Stories index

  27. The output • exists app/controllers/ • exists app/helpers/ • create app/views/stories • exists test/functional/ • create test/unit/helpers/ • create app/controllers/stories_controller.rb • create test/functional/stories_controller_test.rb • create app/helpers/stories_helper.rb • create test/unit/helpers/stories_helper_test.rb • create app/views/stories/index.html.erb

  28. Explaining the output • First it generates a number of folders (unless they have been created already) • StoriesController • Has defined the index method • stories_controller_test.rb • Will hold the test functions • stories_helper.rb • Class to help the controller • Index.html.erb • One of the views which will be our initial template

  29. Let’s see what we have so far ... • Start a server • ruby script/server • Goto • http://127.0.0.1:3000/stories

  30. Creating views Two ways ... With or Without scaffolding!

  31. What is scaffolding? • A powerful feature of rails • Quickly creates a web interface for interacting with your model • Provides an easy way to add, manipulate and delete records • Scaffold generates a model, controller, actions and other templates

  32. Limitations of Scaffold • Designed for quick interaction only • Not intended as a fully automateed web site generator • It can’t cope with associations (relationships) between objects

  33. Let’s scaffold! • ruby script/generate scaffold Story name:String link:String

  34. Let’s see what we have so far ... • Start a server • ruby script/server • Goto • http://127.0.0.1:3000/stories

  35. Script/generate • Scaffold is essentially a script that we invoke using script/generate • The nice thing about script/generate is that there exists a script/destroy using exactly the same arguments • So let’s destroy the scaffold • ruby script/destroy scaffold Story name:String link:String

  36. Let’s see what we have so far ... • Start a server • ruby script/server • Goto • http://127.0.0.1:3000/stories

  37. Ohh No!! We lost everything!! • ruby script/generate model Story name:stringlink:string • ruby script/generate controller Stories index

  38. Let’s see what we have so far ... • Start a server • ruby script/server • Goto • http://127.0.0.1:3000/stories

  39. Views • app/views/stories • Only index.html.erb so far • Generated as a static page • Let’s add some dynamic information • Insert • <%= Time.now %>

  40. Let’s see what we have so far ... • Start a server • ruby script/server • Goto • http://127.0.0.1:3000/stories

  41. Problems! • We shouldn’t be including ruby code directly in the view • Ideally we keep them separated so ... • In the /app/controllers/stories_controller.rb • In the def index add • @current_time = Time.now • In the app/views/stories/index.html.erb replace the previous code with • <%= @current_time %> • Try it out!

  42. Let’s do something more useful • In the controller /app/controllers/stories_controller.rb • In the def index, remove what we just wrote and write • @story = Story.find(:first, :order => ‘RANDOM()’) • In the app/views/stories/index.html.erb replace the previous code with • A random link: <%= link_to @story.name, @story.link %>

  43. Let’s see what we have so far ... • Start a server • ruby script/server • Goto • http://127.0.0.1:3000/stories

  44. Didn’t work? • Why not add some data and try again? • ruby script/console • Loading development environment (Rails 2.3.2) • >> s = Story.new • >> s.name = "ABC" • >> s.link = "http://aaa.com" • >> s.save

  45. Questions?

More Related