Applied Ruby on Rails and AJAX - Conferences - O'Reilly Media
Transcript of Applied Ruby on Rails and AJAX - Conferences - O'Reilly Media
Applied Ruby on Rails & AJAX
An insight into the technology and principles behind a social networking
community
Who am I?
• Farhan Mashraqi (Frank Mash)
• Developer for 7+ years• MySQL DBA• Community Member• A Recovering PHP
Developer
Contact Information:• Business E-mail: [email protected]• Personal E-mail: [email protected] • Personal Blog http://mashraqi.com
What we’ll cover(aka the essentials)
• Why ROR?• MVC• Crash Course (Scaffolding etc)• URLs in ROR• Adoppt• AJAXifying Forms• Relationships / Validations
The essentials continued
• Transactions• Blog Claims• Tagging• In place editing• Learn more• Q&A
Why would I use Ruby On Rails?
• RAD• DRY: “Do not Repeat
Yourself”• Disciplined• Normalization• Relationships• Web Services• Everything is an Object
MVC
Crash Course
[root@srv31 docs]# rails ror create create app/controllers create app/helpers create app/models create app/views/layouts create config/environments create components create db create doc create lib create lib/tasks create log create public/images...
Creating a bare application on Rails
[root@srv31 docs]# rails ror
Do it with Scaffolding
[root@srv31 ror]# ruby script/generate scaffold user exists app/controllers/ exists app/helpers/ create app/views/users exists test/functional/ dependency model exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/user.rb
ruby script/generate scaffold user
CRUD = ‘C’reate, ‘R’ead, ‘U’pdate, ‘D’elete
Experience the magichttp://localhost:3000/users http://localhost:3000/users/new
Find functions
• find_by_[field_name] (field_value)• find_by_[field_name]_and_[field_name]• find_first• find_all_by• find()• find_by_sql(‘SELECT ….’)
URLs in ROR
<%= link_to “Reply”, :controller=>”posts”, :action=>“reply”, :id=>4 %>
What is Adoppt
• A replicatable social networking platform
• Create and participate in communities• Blogs, Forums, Favorites and more
Ajaxifying the login form
Ajaxified version<%= link_to “Login”, :controller=>”member”, :action=>”login” %>
Typical form in ROR
<%= link_to_remote “Login”, :url=>{ :controller=>”member”, :action=>”login” },
:update => “loginform”,:loading => “Element.toggle($(‘loading’))”,:complete => “Element.toggle($(‘loading’))”
%>
Same form ‘AJAXified’
Relationships / Validations• A community
– Has many members subscribed– Members can post favorite web sites– Belongs to a member or system
class Portal < ActiveRecord::Base has_many :subscriptions has_many :favorites belongs_to :member validates_presence_of :portal_name validates_presence_of :portal_description validates_presence_of :portal_url validates_uniqueness_of :portal_url…end
HABTM using Subscriptionsclass Member
has_many :subscriptions end
class Portalhas_many :subscriptions
end
class Subscription belongs_to :member belongs_to :portal
end
Self referential relationships• A member has many friends (member)• Self referential HABTM relationship
class Member < ActiveRecord::Base has_and_belongs_to_many :friends, :class_name => "Member", :join_table => "friends_members", :association_foreign_key => "friend_id", :foreign_key => "member_id", :after_add => :become_friend_with_friend, :after_remove => :end_friendshipend
Using relationships
@portal = Portal.new@favorites = @portal.favorites
1. Which favorites were posted to a portal
2. Which members are subscribed?@portal = Portal.new@members = @portal.subscriptions
@member = Member.new@member_portals = @member.portals
3. Which portals a member is subscribed to?
4. Which members are friends of a member?@member = Member.new@friends = @member.friends
Transactions (InnoDB)Member.transaction(@member, @friend) do
@member.friends << @friend unless @member.friends.include?(@friend)
@friend.friends << @member unless @friend.friends.include?(@member)
end
Blog Claimsdef claim_verify @wb= Weblog.find_by_url(@params[:url]) require 'open-uri‘ @found = open(@wb.url).read.include?(@wb.v_key)end
Tagging
• acts_as_taggable gem (http://taggable.rubyforge.org/)
Taggingclass Article < ActiveRecord::Base acts_as_taggable :join_class_name => 'TagArticle‘
class TagArticle
belongs_to :article, :class_name => 'Article', :foreign_key => 'article_id‘
@tagged = Article.tags_count(:limit => 10)
Tagging an article@article = [email protected] “mysql conference ror”
Tags for an article@tags = @article.tags()
Tag Cloud (Tom Fakes)
In place editing
class BlogsController < ApplicationController in_place_edit_for :weblog, :description
<%= in_place_editor_field :weblog, :description, :value=>'' %>
In your views file
In your model
Recap
• ROR: Valuable to You
Where to learn more• Books
– Agile Web Development with Rails by Dave Thomas and David Heinemeier Hansson
– Pro Rails by me– ROR Recipes by Chad Fowler
• Websites– http://www.ruby-doc.org/– http://www.rubygarden.org/ruby/– http://www.ruby-lang.org/– http://www.ruby-doc.org/stdlib/libdoc/rdoc/rdoc/index.html– http://script.aculo.us– http://rubyonrails.adoppt.com/blog/frank
Q&A