SlideShare a Scribd company logo
1 of 72
Download to read offline
Rails vs. Facebooker
                                  Facebook-Apps mit Facebooker
                            Jan Krutisch <jan.krutisch@mindmatters.de>




                                                                           10. Juni 2009
                                                               Rails Usergroup Hamburg
Donnerstag, 11. Juni 2009
Facebook you say?



Donnerstag, 11. Juni 2009
200 Gazillionen
                               Benutzer


Donnerstag, 11. Juni 2009
(pro Tag)



Donnerstag, 11. Juni 2009
(ungefähr)



Donnerstag, 11. Juni 2009
verdammt viele



Donnerstag, 11. Juni 2009
potentielle Kunden



Donnerstag, 11. Juni 2009
für was?



Donnerstag, 11. Juni 2009
for great justice



Donnerstag, 11. Juni 2009
Step 3: Profit



Donnerstag, 11. Juni 2009
Virales Wachstum und
                          so...


Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
Glaubt mir!



Donnerstag, 11. Juni 2009
anyway



Donnerstag, 11. Juni 2009
facebook application?



Donnerstag, 11. Juni 2009
Integrationspunkte



Donnerstag, 11. Juni 2009
Canvas



Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
• App in App (Proxy bzw. iFrame)
                    • HTML plus FBML
                    • Zusätzliche Parameter, Header etc.


Donnerstag, 11. Juni 2009
FBML ZOMG WTF?



Donnerstag, 11. Juni 2009
Face Book Markup
                                Language


Donnerstag, 11. Juni 2009
<fb:fbml>
                <fb:header>dings</fb:header>
                <%- fb_tabs do -%>
                  <%= yield :tabs %>
                <%- end -%>
                <fb:add-section-button section=quot;profilequot; />
                <%= yield %>
              </fb:fbml>




Donnerstag, 11. Juni 2009
loads of tags



Donnerstag, 11. Juni 2009
BML
                                                               hp/F
                                                    ind ex.p
                                                  m/
                                          oo k.co
                              rs.f aceb
                      eve lope
             //w iki.d
     http:

                                                        Text




Donnerstag, 11. Juni 2009
• Daten-Integration
                    • Cache-Hilfen
                    • Forms
                    • Styling
                    • Visibility

Donnerstag, 11. Juni 2009
API



Donnerstag, 11. Juni 2009
(out of scope)



Donnerstag, 11. Juni 2009
Profil-Widgets pushen



Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
(Auch FBML)



Donnerstag, 11. Juni 2009
Notifications



Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
Publisher



Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
Facebook Connect



Donnerstag, 11. Juni 2009
(Think OAuth)



Donnerstag, 11. Juni 2009
Weitere Technologien



Donnerstag, 11. Juni 2009
FBJS



Donnerstag, 11. Juni 2009
Face Book Just Sucks



Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
<%= image_tag image.small_url,
                :id => quot;gallery_image_#{image.id}quot;,
                :class => quot;gallery-imagequot;,
                :onclick => quot;setImage(#{image.id});return false;quot; %>




Donnerstag, 11. Juni 2009
<img alt=quot;101_21480322_originalquot; class=quot;gallery-
              imagequot; id=quot;app208488715334_gallery_image_29quot;
              onclick=quot;fbjs_sandbox.instances.a208488715334.bo
              otstrap();return
              fbjs_dom.eventHandler.call([fbjs_dom.get_instanc
              e(this,
              208488715334),function(a208488715334_event)
              {a208488715334_setImage(29);return false;},
              208488715334],new fbjs_event(event));return
              true;quot; src=quot;http://s3.amazonaws.com/com.dpa-
              info.widget.staging/
              101_21480322_original.small-1-1-200-126-0-582-45
              6.jpgquot; fbcontext=quot;fa3facfe268fquot;>




Donnerstag, 11. Juni 2009
Aber wie?



Donnerstag, 11. Juni 2009
Facebooker



Donnerstag, 11. Juni 2009
Chad Fowler



Donnerstag, 11. Juni 2009
Mike Mangino



Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
• Sehr coole API-Umsetzung
                    • before_filter f. Auth etc.
                    • Fast alle APIs abgedeckt
                    • Publisher (wie Mailer) f. Notifications,
                            Profile, Profile-Publisher

                    • FBML-Helper

Donnerstag, 11. Juni 2009
Configure



Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
Donnerstag, 11. Juni 2009
development:
                api_key: ---------------------------------
                secret_key: ----------------------------------
                canvas_page_name: example
                callback_url: http://example:4007
                pretty_errors: true
                set_asset_host_to_callback_url: true
                tunnel:
                  public_host_username: johndoe
                  public_host: example.com
                  public_port: 4007
                  local_port: 3000
                  server_alive_interval: 0

              test:
                api_key: ---------------------------------
                secret_key: ----------------------------------
                canvas_page_name: example
                callback_url: http://example:4007
                pretty_errors: true
                set_asset_host_to_callback_url: true
                tunnel:
                  public_host_username: johndoe
                  public_host: example.com
                  public_port: 4007
                  local_port: 3000
                  server_alive_interval: 0




Donnerstag, 11. Juni 2009
rake facebooker:tunnel:start




Donnerstag, 11. Juni 2009
ssh -R :4007:localhost:3000 johndoe@example.com sleep 999999




Donnerstag, 11. Juni 2009
#/etc/ssh/sshd_config

              GatewayPorts clientspecified




Donnerstag, 11. Juni 2009
$ /script/server




Donnerstag, 11. Juni 2009
client browser

                              facebook

                            example.com

                            dev machine




Donnerstag, 11. Juni 2009
CodePorn.random



Donnerstag, 11. Juni 2009
ApplicatioController



Donnerstag, 11. Juni 2009
# Filters added to this controller apply to all controllers in the application.
              # Likewise, all the methods added will be available for all controllers.

              class ApplicationController < ActionController::Base

                  include ExceptionNotifiable

                  helper :all # include all helpers, all the time
                  protect_from_forgery # See ActionController::RequestForgeryProtection for d...

                  helper_attr :current_user

                  attr_accessor :current_user

                  ensure_authenticated_to_facebook

                  before_filter :create_facebook_session, :set_current_user


                  # Scrub sensitive parameters from your log
                  # filter_parameter_logging :password

                  def set_current_user
                    self.current_user = User.for(facebook_session.user.to_i, facebook_session)
                  end

              end




Donnerstag, 11. Juni 2009
<fb:fbml>
                <style type=quot;text/cssquot; media=quot;screenquot;>
                      ul.image-list li h2 {
                    margin-bottom: 5px;
                  }

                      .single-image {
                        width:760px;
                        text-align:center;
                        margin-top:10px;
                      }
                      .single-image h2 {
                        margin-bottom: 5px;
                      }

                  </style>
                  <fb:header>dpa-info.com galerie</fb:header>
                  <%- fb_tabs do -%>
                    <%= yield :tabs %>
                  <%- end -%>
                  <fb:add-section-button section=quot;profilequot; />
                  <%= yield %>

              </fb:fbml>




Donnerstag, 11. Juni 2009
application.fbml.erb



Donnerstag, 11. Juni 2009
<%- content_for :tabs do -%>
                <%= fb_tab_item 'Gallery', root_url, :selected => true %>
                <%= fb_tab_item 'Invite your friends', new_invitation_url %>
              <%- end -%>




Donnerstag, 11. Juni 2009
Profile Template



Donnerstag, 11. Juni 2009
<%- @assigns[:images].each do |image| -%>
                <%= link_to image_tag(image.small_url,
                :title => h(image.title),
                :alt => h(image.title)), root_url %>
              <%- end -%>
              <%= link_to quot;Mehr Bilder...quot;, gallery_url %>




Donnerstag, 11. Juni 2009
Publisher



Donnerstag, 11. Juni 2009
class GalleryPublisher < Facebooker::Rails::Publisher

                def image_feed_template
                  app_link = link_to(quot;Mehr Photos...quot;,root_url)
                  one_line_story_template quot;{*actor*} mag das Photo '{*image_title*}'
              #{app_link}quot;
                  short_story_template quot;{*actor*} mag das Photo '{*image_title*}' aus der dpa-
              Galeriequot;, quot;#{app_link}quot;
                end

                  def image_feed(user, image)
                    send_as :user_action
                    from user
                    data :image_title => image.title,
                         :images=>[image(image.small_url,root_url)]
                  end


                def profile_update(user)
                  send_as :profile
                  recipients user
                  @images = DailyImage.latest.all(:limit => 10)
                  profile render(:partial => quot;profilequot;, :assigns => {:images => @images} )
                  profile_main render(:partial => quot;profile_narrowquot;, :assigns => {:images =>
              @images[0..3]} )
                end
              end




Donnerstag, 11. Juni 2009
ProfilePublisher



Donnerstag, 11. Juni 2009
class ProfilePublisherController < ApplicationController
                skip_before_filter :ensure_authenticated_to_facebook
                def index

                     if current_user.nil? and facebook_params[:user]
                       self.current_user = User.for(facebook_params[:user])
                     end

                  if wants_interface?
                    @images = DailyImage.latest.all(:limit => 10)
                    render_publisher_interface(render_to_string(:partial=>quot;formquot;, :assigns =>
              {:images => @images}))
                  else
                    @image = DailyImage.find(params[:app_params][:id])
                    render_publisher_response(GalleryPublisher.create_image_feed(current_user,
              @image))
                  end
                end
              end




Donnerstag, 11. Juni 2009
some more code...



Donnerstag, 11. Juni 2009
fin



Donnerstag, 11. Juni 2009

More Related Content

More from jan_mindmatters

Railsrumble railscamphh 2010
Railsrumble railscamphh 2010Railsrumble railscamphh 2010
Railsrumble railscamphh 2010jan_mindmatters
 
MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)jan_mindmatters
 
Mongodb on Ruby And Rails (froscon 2010)
Mongodb on Ruby And Rails (froscon 2010)Mongodb on Ruby And Rails (froscon 2010)
Mongodb on Ruby And Rails (froscon 2010)jan_mindmatters
 
10 fun projects to improve your coding skills
10 fun projects to improve your coding skills10 fun projects to improve your coding skills
10 fun projects to improve your coding skillsjan_mindmatters
 
MongoDB & Mongomapper 4 real
MongoDB & Mongomapper 4 realMongoDB & Mongomapper 4 real
MongoDB & Mongomapper 4 realjan_mindmatters
 
Open Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerersOpen Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerersjan_mindmatters
 
Lehmanns Rails Erweitern
Lehmanns Rails ErweiternLehmanns Rails Erweitern
Lehmanns Rails Erweiternjan_mindmatters
 
Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007jan_mindmatters
 

More from jan_mindmatters (9)

Railsrumble railscamphh 2010
Railsrumble railscamphh 2010Railsrumble railscamphh 2010
Railsrumble railscamphh 2010
 
MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)
 
Mongodb on Ruby And Rails (froscon 2010)
Mongodb on Ruby And Rails (froscon 2010)Mongodb on Ruby And Rails (froscon 2010)
Mongodb on Ruby And Rails (froscon 2010)
 
10 fun projects to improve your coding skills
10 fun projects to improve your coding skills10 fun projects to improve your coding skills
10 fun projects to improve your coding skills
 
MongoDB & Mongomapper 4 real
MongoDB & Mongomapper 4 realMongoDB & Mongomapper 4 real
MongoDB & Mongomapper 4 real
 
Open Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerersOpen Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerers
 
Merb. Rails in anders.
Merb. Rails in anders.Merb. Rails in anders.
Merb. Rails in anders.
 
Lehmanns Rails Erweitern
Lehmanns Rails ErweiternLehmanns Rails Erweitern
Lehmanns Rails Erweitern
 
Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007
 

Facebook mit Rails und Facebooker