MVC & ActiveRecord by Christian Mohr & Mohamed Souiai
Content MVC ActionController ActionView ActiveRecord Routing
Model View Controller Architectural pattern for interactive Applications. Isolates business logic from user interface consideration. Grants flexibility modularity reusability of Objects.
Model In general the model represents the information (the data) of the application and the business rules used to manipulate the data. Inside Ruby on Rails the ActiveRecord Module corresponds to the model in the MVC paradigm.
View In general the view corresponds to elements of the user interface such as text, checkbox items. In Rails the ActionView is used to create Templates and visualizes the data provided by the controller, in different formats.
Controller In general the controller manages details involving the communication to the model of user actions such as keystrokes and mouse movements. In Rails the Controller is realized by the ActionController who coordinates the interaction between user and Application.
A simple bookmark projekt In the following slide we introduce the MVC paradigm in the context of Ruby on rails.
Control center ActionController Tasks: Receiving Http-Request data (i.e. Form data) Database requests via model-classes. Setting and query of cookies and sessions. Setting flash messages. Calling templates. Forwarding Files and data. Authentication.
Control center ActionController Our Controller class inherits from the ApplicationController. Class AirportsController < ApplicationController UML Diagram:
Control center ActionController Controller generator: Syntax: ruby script/generate controller name [action_1 … action_N] Generates the controller app/controllers/ name _controller.rb with optional actions and ActionViews: app/views/ name / action_n.html.erb. The Actions can be added manually. In that case, the corresponding views are not generated automatically. 1,2
Control center ActionController Controller Actions: The public Methods of the Controller Access via URL call: : / / 3,4,5
ActionView Template-File containing Ruby- and HTML- Code. By Convention, the name is the same as the corresponding action. All View-Files have the extension. html.erb
ActionView Syntax in ActionView Files Ruby Code: Ruby Output: By using html_escape(…) or h(…) Tag-specific characters (i.e. and &) are masked.
ActionView Instance variables: Variables with a leading ’ are accessible to all methods inside the defining controller and the corresponding views.
ActiveRecord … treating Data from a Database like Objects Domain Specific Language (DSL) “ActiveReord” Design pattern by Martin Fowler: Mapping object-oriented Data to relational Data and vice versa.
ActiveRecord Models: Classes, that represent a data- table and are responsible for the database operations (CRUD) Each row in the database represents a model-object
ActiveRecord Model-Generator Syntax: ruby script/generate model modelname Generates the ActiveRecord model file app/models/ modelname.rb To create a new Row in the data table, we create a new Object of the class modelname. By Convention, the data table name is lower case and plural and the model class name is in singular with upper case initial. 6
ActiveRecord CRUD (Create, Read, Update Delete) The four basic database operations: Create create a new dataset Readread a dataset Updatealter an existing dataset Deletedelete a dataset
ActiveRecord ActiveRecord-Classes provide methods for the following basic database operations: newcreates a new ActiveRecord-Object Create(…)creates and saves a new AR-Object Find(ID)finds the correspoding dataset Find(:all, :conditions=>…) It is possible to add custom methods. 7,8
ActiveRecord ActiveRecord-Objects offer the following methods: savesaving an object to the database updatealter all or single object attributes destroydelete an object
ActiveRecord Interesting Functions: Validation Before- and After-Filter Associations and Relations Migrations Transactions Automatic attributes (created_at, updated_at)
ActiveRecord Oracle PostgreSQL SQLite Sybas Supported relational management database systems DB2 Firebird Frontbase MySQL Openbase
Routing Defines which internal controller and action should be called depending on the URL. Routing rules are stored in config/routes.rb Auto generated entries: ActionController::Routing::Routes.draw do |map| #... map.connect ':controller/:action/:id' map.connect ':controller/:action/:id.:format' end Restart the server after changing the Routing!
Routing Routing Diagram
Routing Links To generate a Link to The code in the View would look like this: 'bookmarks', :action => "show", :id => 1 %> There are ways to simplify this!
Routing Simplified URL’s using map.connect Given Routing: Desired URL: Add routing-entry above standard entries: map.connect 'login', :controller => "authentication”, :action => "login"
Routing Named Routes using map.name Add routing-entry above standard entries: map.login 'login', :controller => "authentication", :action => "login" Provides login_url and login_path name_urlcontains absolute path incl. host name_pathcontains relative path without host.
Routing root routeusing map.root An applications default index page URL: If no controller provided (i.e. the default rails welcome-page is displayed changing config/routes.rb entry to map.root :controller => "bookmarks” makes bookmarks the root controller Make sure to delete homonymous files in pubic/
Routing Also possible: Complex routing with regular expressions Routing with defined HTTP-Method (GET, POST, PUT, DELETE)
The end Thank you for listening.