My favorites | Sign in
Project Home Downloads Wiki Issues Source
Project Information
Members
Links

Facebook on Rails is a sexy plugin for developing Facebook apps

The author (Hoan) has discontinued support for this plugin.

Sexy stuff:

  • acts_as_fb_user
  • FBMLController (with url_for and redirect_to that work)
  • ActionMailer-style notifications, invitiations, requests, news-feed publishing, and profile updating
  • API calls return ruby objects, parsed from XML

You still have access to the `fbsession' variable just like RFacebook.

Installation

Everything you need is in the plugin.

./script/plugin install -x http://facebook-rails.googlecode.com/svn/trunk/facebook

Configuration

Configuration is really simple. Put this in your environment.rb:

Facebook.api_key       = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
Facebook.secret_key    = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
Facebook.canvas_path   = '/myappname'
Facebook.callback_path = '/fb'

FBMLController

Your ApplicationController should inherit from Facebook::FBMLController. Change your application.rb to this:

class ApplicationController < Facebook::FBMLController
  before_filter :require_facebook_install
  before_filter :import_user

  private
  def import_user
    @user = User.import(fbsession)
  end
end

Now any routes you generate will be canvas pages (ie http://apps.facebook.com/myappname/path/to/foo). To generate normal urls, supply :canvas => false to your route (ie my_url(:canvas => false)).

acts_as_fb_user

Your user model should be similar to this:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :uid, :integer, :null => false
      t.column :session_key, :string
    end

    add_index :users, :uid, :unique
  end

  def self.down
    drop_table :users
  end
end

class User < ActiveRecord::Base
  acts_as_fb_user

  def self.import(fbsession)
    user = self.find_or_initialize_by_uid(fbsession.session_user_id)

    # Assumes session_key never expires
    if fbsession.session_key != user.session_key
      user.session_key = fbsession.session_key
      user.save!
    end

    return user
  end
end

Now acts_as_fb_user assumes the model has two fields: uid and session_key. The session_key should be an unlimited session key for your app. Given this, we can:

>> u = User.find(1)
=> #<User:...>
>> u.name
=> "Hoan Ton-That"
>> u.affiliations.map(&:name)
=> ["Australian National", "Australia"]
>> u.friends
=> [1, 2, 3]
>> u.get_fbml
=> "FBML goes here"
>> u.music
=> "Bach, Barrios, Piazzolla"

API Calls:

The current Facebook session is kept implicit in a dynamic variable. So you can write this in your controller or model (provided that the controller has set fbsession):

class MyController < Facebook::FBMLController
  def friends
    @me         = Facebook::Users.get_info(fbsession.session_user_id, ['first_name', 'last_name'])
    @first_name = @me.first_name
    @last_name  = @me.last_name
    @friends    = Facebook::Friends.get
  end
end

All the API calls follow the same pattern of Facebook::Prefix.method_call. Unlike RFacebook, these calls return the result as ruby objects (Facebook::Friends.get returns an array of Integers) instead of XML.

Backward compatibility:

You can still call fbsession.friends_get and it will return Hpricot. Thanks to the RFacebook devs!

Powered by Google Project Hosting