FbRails

FbRails makes it easy to integrate your website with Facebook.

Setting up

Add the following to your configuration. This can go in config/application.rb, or customized in each environment in config/environments/.rb:

config.facebook = {
  :app_id     => 'my_app_id',
  :secret     => 'my_app_secret'
}

or

config.facebook.app_id = 'my_app_id'
config.facebook.secret = 'my_app_secret'

Include facebook Javascript and a login button:

<%= include_facebook_javascript %>
<%= fbml 'login-button' %>

FBRails API

FbRails adds an object called ‘fb’, which is available to all controllers and views:

Determine if the current user is connected through Facebook:

fb.connected?

Get the Facebook user id for the current user:

fb.uid

Get the Facebook user’s access token:

fb.access_token

Retrieve your Facebook application app_id or secret:

fb.app_id
fb.secret

Using the Graph API

Make a request to the Facebook Graph:

<% result = fb.graph.get 'me' %>
my name is <%= result['first_name'] %>

Post to the user’s wall:

fb.graph.post 'me/feed', :message => 'I like turtles'

Persisting the Facebook User:

Websites that interact with Facebook usually have a user model in a local database. This user is accessed with ‘fb.user’:

The current user is <%= fb.user.inspect %>

For this to work, FbRails assumes there is a model called ‘User’ with a column ‘fb_uid’. If your user model name is different than ‘User’, it can be configured:

config.facebook.user_class_name = 'Author'

If the fb_uid for the current user is not in the database, fb.user is an unsaved instance. One thing I like to do for new Facebook users is store them in a before filter:

if fb.connected? && fb.user.new_record?
  data = fb.graph.get('me')
  fb.user.first_name = data['first_name']
  fb.user.last_name = data['last_name']
  fb.user.save
end

Timeouts

Calls to the Graph API can timeout. If this occurs, an FbRails::TimeoutError occurs. Your application can rescue from these:

begin
  fb.get 'me'
rescue FbRails::TimeoutError => e
  ...
end

The timeout defaults to 60 seconds. This can be configured:

config.timeout = 10

Testing

Facebook requests can be mocked, so that your tests do not require real HTTP connections. This is done with FbRails::Mock:

FbRails::Mock.respond_to do |mock|
  mock.add 'me', 'first_name' => 'Matt', 'last_name' => 'Higgins'
end

Now, a call to fb.graph.get(‘me’) returns the above response.