Module: Facebooker::Rails::Helpers

Includes:
FbConnect
Defined in:
lib/facebooker/rails/helpers.rb,
lib/facebooker/rails/helpers/fb_connect.rb

Overview

Facebook specific helpers for creating FBML

All helpers that take a user as a parameter will get the Facebook UID from the facebook_id attribute if it exists. It will use to_s if the facebook_id attribute is not present.

Defined Under Namespace

Modules: FbConnect

Constant Summary collapse

FB_DIALOG_BUTTON_VALID_OPTION_KEYS =
[:close_dialog, :href, :form_id, :clickrewriteurl, :clickrewriteid, :clickrewriteform]
FB_NAME_OPTION_KEYS_TO_TRANSFORM =
{:first_name_only => :firstnameonly, 
:last_name_only => :lastnameonly,
:show_network => :shownetwork,
:use_you => :useyou,
:if_cant_see => :ifcantsee,
:subject_id => :subjectid}
FB_NAME_VALID_OPTION_KEYS =
[:firstnameonly, :linked, :lastnameonly, :possessive, :reflexive, 
:shownetwork, :useyou, :ifcantsee, :capitalize, :subjectid]
FB_PRONOUN_OPTION_KEYS_TO_TRANSFORM =
{:use_you => :useyou, :use_they => :usethey}
FB_PRONOUN_VALID_OPTION_KEYS =
[:useyou, :possessive, :reflexive, :objective, 
:usethey, :capitalize]
FB_REF_VALID_OPTION_KEYS =
[:url, :handle]
FB_PROFILE_PIC_OPTION_KEYS_TO_TRANSFORM =
{:facebook_logo => 'facebook-logo'}
FB_PROFILE_PIC_VALID_OPTION_KEYS =
[:size, :linked, 'facebook-logo', :width, :height]
FB_PHOTO_VALID_OPTION_KEYS =
[:uid, :size, :align]
VALID_FB_SHARED_PHOTO_SIZES =
[:thumb, :small, :normal, :square]
VALID_FB_PHOTO_SIZES =
VALID_FB_SHARED_PHOTO_SIZES
VALID_FB_PROFILE_PIC_SIZES =
VALID_FB_SHARED_PHOTO_SIZES
VALID_PERMISSIONS =
[:email, :offline_access, :status_update, :photo_upload, :create_listing, :create_event, :rsvp_event, :sms, :video_upload, 
:publish_stream, :read_stream]
FB_TAB_ITEM_VALID_OPTION_KEYS =
[:align, :selected]
VALID_FB_SHARED_ALIGN_VALUES =
[:left, :right]
VALID_FB_PHOTO_ALIGN_VALUES =
VALID_FB_SHARED_ALIGN_VALUES
VALID_FB_TAB_ITEM_ALIGN_VALUES =
VALID_FB_SHARED_ALIGN_VALUES

Instance Method Summary collapse

Methods included from FbConnect

#fb_bookmark_link, #fb_connect_javascript_tag, #fb_login_and_redirect, #fb_login_button, #fb_logout_link, #fb_unconnected_friends_count, #fb_user_action, #init_fb_connect

Instance Method Details

#cast_to_photo_id(object) ⇒ Object



350
351
352
# File 'lib/facebooker/rails/helpers.rb', line 350

def cast_to_photo_id(object)
  object.respond_to?(:photo_id) ? object.photo_id : object
end

#facebook_form_for(record_or_name_or_array, *args, &proc) ⇒ Object

Create a facebook form using <fb:editor>

It yields a form builder that will convert the standard rails form helpers into the facebook specific version.

Example:

<% facebook_form_for(:poke,@poke,:url => create_poke_path) do |f| %>
  <%= f.text_field :message, :label=>"message" %>
  <%= f.buttons "Save Poke" %>
<% end %>

will generate

<fb:editor action="/pokes/create">
  <fb:editor-text name="poke[message]" id="poke_message" value="" label="message" />
  <fb:editor-buttonset>
   <fb:editor-button label="Save Poke"
  </fb:editor-buttonset>
</fb:editor>

Raises:

  • (ArgumentError)


195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/facebooker/rails/helpers.rb', line 195

def facebook_form_for( record_or_name_or_array,*args, &proc)

  raise ArgumentError, "Missing block" unless block_given?
  options = args.last.is_a?(Hash) ? args.pop : {}

  case record_or_name_or_array
  when String, Symbol
    object_name = record_or_name_or_array
  when Array
    object = record_or_name_or_array.last
    object_name = ActionController::RecordIdentifier.singular_class_name(object)
    apply_form_for_options!(record_or_name_or_array, options)
    args.unshift object
  else
    object = record_or_name_or_array
    object_name = ActionController::RecordIdentifier.singular_class_name(object)
    apply_form_for_options!([object], options)
    args.unshift object
  end
  method = (options[:html]||{})[:method]
  options[:builder] ||= Facebooker::Rails::FacebookFormBuilder
  editor_options={}
  
  action=options.delete(:url)
  editor_options[:action]= action unless action.blank?
  width=options.delete(:width)
  editor_options[:width]=width unless width.blank?
  width=options.delete(:labelwidth)
  editor_options[:labelwidth]=width unless width.blank?

  if ignore_binding?
    concat(tag("fb:editor",editor_options,true))
    concat(tag(:input,{:type=>"hidden",:name=>:_method, :value=>method},false)) unless method.blank?
    concat(token_tag)
    fields_for( object_name,*(args << options), &proc)
    concat("</fb:editor>")
  else
    concat(tag("fb:editor",editor_options,true) , proc.binding)
    concat(tag(:input,{:type=>"hidden",:name=>:_method, :value=>method},false), proc.binding) unless method.blank?
    concat(token_tag, proc.binding)
    fields_for( object_name,*(args << options), &proc)
    concat("</fb:editor>",proc.binding)
  end
end

#facebook_messagesObject

Render flash values as <fb:message> and <fb:error> tags

values in flash will be rendered as an <fb:message>

values in flash will be rendered as an <fb:error>

TODO: Allow flash to render fb_explanation



456
457
458
459
460
461
462
463
464
465
# File 'lib/facebooker/rails/helpers.rb', line 456

def facebook_messages
  message=""
  unless flash[:notice].blank?
    message += fb_success(*flash[:notice])
  end
  unless flash[:error].blank?
    message += fb_error(*flash[:error])
  end
  message
end

#fb_about_urlObject

Return the URL for the about page of the application



628
629
630
# File 'lib/facebooker/rails/helpers.rb', line 628

def fb_about_url
  "http://#{Facebooker.www_server_base_url}/apps/application.php?api_key=#{Facebooker.api_key}"
end

#fb_action(name, url) ⇒ Object

Renders an action using the <fb:action> tag



510
511
512
# File 'lib/facebooker/rails/helpers.rb', line 510

def fb_action(name, url)
  "<fb:action href=\"#{url_for(url)}\">#{name}</fb:action>"
end

#fb_add_info_sectionObject

Renders an ‘Add to Info’ button The button allows a user to add an application info section to her Info tab



658
659
660
# File 'lib/facebooker/rails/helpers.rb', line 658

def fb_add_info_section
  tag "fb:add-section-button",:section=>"info"
end

#fb_add_profile_sectionObject

Renders an ‘Add to Profile’ button The button allows a user to add condensed profile box to the main profile



652
653
654
# File 'lib/facebooker/rails/helpers.rb', line 652

def fb_add_profile_section
  tag "fb:add-section-button",:section=>"profile"
end

#fb_application_name(options = {}) ⇒ Object

Render an fb:application-name tag

This renders the current application name via fbml. See wiki.developers.facebook.com/index.php/Fb:application-name for a full description.



246
247
248
# File 'lib/facebooker/rails/helpers.rb', line 246

def fb_application_name(options={})
  tag "fb:application-name", stringify_vals(options)
end

#fb_board(xid, options = {}) ⇒ Object

Embed a discussion board named xid on the current page <em>See</em wiki.developers.facebook.com/index.php/Fb:board for more details Options are:

* canpost
* candelete
* canmark
* cancreatet
* numtopics
* callbackurl
* returnurl


644
645
646
647
648
# File 'lib/facebooker/rails/helpers.rb', line 644

def fb_board(xid,options={})
  options = options.dup
  title = (title = options.delete(:title)) ? fb_title(title) : nil
  ("fb:board", title, stringify_vals(options.merge(:xid=>xid)))
end

#fb_bookmark_buttonObject

Renders the Facebook bookmark button

See wiki.developers.facebook.com/index.php/Fb:bookmark for more details



788
789
790
# File 'lib/facebooker/rails/helpers.rb', line 788

def fb_bookmark_button
   "fb:bookmark"
end

#fb_comments(xid, canpost = true, candelete = false, numposts = 5, options = {}) ⇒ Object

Create a comment area All the data for this content area is stored on the facebook servers. See: wiki.developers.facebook.com/index.php/Fb:comments for full details



529
530
531
532
533
# File 'lib/facebooker/rails/helpers.rb', line 529

def fb_comments(xid,canpost=true,candelete=false,numposts=5,options={})
  options = options.dup
                    title = (title = options.delete(:title)) ? fb_title(title) : nil 
   "fb:comments",title,stringify_vals(options.merge(:xid=>xid,:canpost=>canpost.to_s,:candelete=>candelete.to_s,:numposts=>numposts))
end

#fb_container(options = {}, &proc) ⇒ Object



731
732
733
734
# File 'lib/facebooker/rails/helpers.rb', line 731

def fb_container(options={},&proc)
  inner = capture(&proc)
  concat(("fb:container",inner,options),&proc.binding)
end

#fb_create_button(name, url) ⇒ Object

Render a <fb:create-button> tag For use inside <fb:dashboard>



522
523
524
# File 'lib/facebooker/rails/helpers.rb', line 522

def fb_create_button(name, url)
   "<fb:create-button href=\"#{url_for(url)}\">#{name}</fb:create-button>"
end

#fb_dashboard(&proc) ⇒ Object

Create a dashboard. It can contain fb_action, fb_help, and fb_create_button

For Example:

<% fb_dashboard do %>
  <%= APP_NAME %>
  <%= fb_action 'My Matches', search_path %>
  <%= fb_help 'Feedback', "http://www.facebook.com/apps/application.php?id=6236036681" %>
  <%= fb_create_button 'Invite Friends', main_path %>
<% end %>


476
477
478
479
480
481
482
483
484
485
486
487
# File 'lib/facebooker/rails/helpers.rb', line 476

def fb_dashboard(&proc)
  if block_given?
    content = capture(&proc)
    if ignore_binding?
      concat(("fb:dashboard",content,{}))
    else
      concat(("fb:dashboard",content,{}),proc.binding)
    end
  else
    ("fb:dashboard",content,{})
  end
end

#fb_date(time, options = {}) ⇒ Object

Renders a fb:date element

Example: <%= fb_date(Time.now, :format => ‘verbose’, :tz => ‘America/New York’) %>

See wiki.developers.facebook.com/index.php/Fb:date for more details



780
781
782
# File 'lib/facebooker/rails/helpers.rb', line 780

def fb_date(time, options={})
  tag "fb:date", stringify_vals({:t => time.to_i}.merge(options))
end

#fb_dialog(id, cancel_button, &block) ⇒ Object

Create an fb:dialog id must be a unique name e.g. “my_dialog” cancel_button is true or false



18
19
20
21
22
23
24
25
# File 'lib/facebooker/rails/helpers.rb', line 18

def fb_dialog( id, cancel_button, &block )
  content = capture(&block)
  if ignore_binding?
    concat( ("fb:dialog", content, {:id => id, :cancel_button => cancel_button}) )
  else
    concat( ("fb:dialog", content, {:id => id, :cancel_button => cancel_button}), block.binding )
  end
end

#fb_dialog_button(type, value, options = {}) ⇒ Object



53
54
55
56
57
# File 'lib/facebooker/rails/helpers.rb', line 53

def fb_dialog_button( type, value, options={} )
  options.assert_valid_keys FB_DIALOG_BUTTON_VALID_OPTION_KEYS
  options.merge! :type => type, :value => value
  tag "fb:dialog-button", options
end

#fb_dialog_content(&block) ⇒ Object



44
45
46
47
48
49
50
51
# File 'lib/facebooker/rails/helpers.rb', line 44

def fb_dialog_content( &block )
  content = capture(&block)
  if ignore_binding?
    concat( ("fb:dialog-content", content) )
  else
    concat( ("fb:dialog-content", content), block.binding )
  end
end

#fb_dialog_title(title) ⇒ Object



40
41
42
# File 'lib/facebooker/rails/helpers.rb', line 40

def fb_dialog_title( title )
   "fb:dialog-title", title
end

#fb_else(&proc) ⇒ Object

Render fb:else tag Must be used within if block such as fb_if_is_user or fb_if_is_app_user . See example in fb_if_is_app_user



617
618
619
620
621
622
623
624
# File 'lib/facebooker/rails/helpers.rb', line 617

def fb_else(&proc)
  content = capture(&proc)
  if ignore_binding?
    concat(("fb:else",content))
  else
    concat(("fb:else",content),proc.binding)
  end
end

#fb_error(message, text = nil) ⇒ Object

Render an <fb:error> tag If message and text are present then this will render fb:error and fb:message tag TODO: Optionally takes a decoration tag with value of ‘no_padding’ or ‘shorten’



432
433
434
# File 'lib/facebooker/rails/helpers.rb', line 432

def fb_error(message, text=nil)
  fb_status_msg("error", message, text)
end

Renders an <fb:eventlink /> tag that displays the event name and links to the event’s page.



704
705
706
# File 'lib/facebooker/rails/helpers.rb', line 704

def fb_eventlink(eid)
   "fb:eventlink",nil,:eid=>eid
end

#fb_explanation(message, text = nil) ⇒ Object

Render an <fb:explanation> tag If message and text are present then this will render fb:error and fb:message tag TODO: Optionally takes a decoration tag with value of ‘no_padding’ or ‘shorten’



439
440
441
# File 'lib/facebooker/rails/helpers.rb', line 439

def fb_explanation(message, text=nil)
  fb_status_msg("explanation", message, text)
end

#fb_fbml_attribute(name, text, options = {}) ⇒ Object

Renders a fb:fbml-attribute element

Example: <%= fb_fbml_attribute(‘title’, Education) %>

The options hash is passed to the fb:intl element that is generated inside this element and can have the keys available for the fb:intl element.

See wiki.developers.facebook.com/index.php/Fb:fbml-attribute for more details



802
803
804
# File 'lib/facebooker/rails/helpers.rb', line 802

def fb_fbml_attribute(name, text, options={})
  ("fb:fbml-attribute", fb_intl(text, options), stringify_vals({:name => name}))
end

#fb_friend_selector(options = {}) ⇒ Object

Render an <fb:friend-selector> element See: wiki.developers.facebook.com/index.php/Fb:friend-selector for options



141
142
143
# File 'lib/facebooker/rails/helpers.rb', line 141

def fb_friend_selector(options={})
  tag("fb:friend-selector",stringify_vals(options))
end

#fb_google_analytics(uacct, options = {}) ⇒ Object

Create a Google Analytics tag

uacct: Your Urchin/Google Analytics account ID.



547
548
549
550
# File 'lib/facebooker/rails/helpers.rb', line 547

def fb_google_analytics(uacct, options={})
  options = options.dup
  tag "fb:google-analytics", stringify_vals(options.merge(:uacct => uacct))
end

Renders an <fb:grouplink /> tag that displays the group name and links to the group’s page.



709
710
711
# File 'lib/facebooker/rails/helpers.rb', line 709

def fb_grouplink(gid)
   "fb:grouplink",nil,:gid=>gid
end

#fb_help(name, url) ⇒ Object

Render a <fb:help> tag For use inside <fb:dashboard>



516
517
518
# File 'lib/facebooker/rails/helpers.rb', line 516

def fb_help(name, url)
  "<fb:help href=\"#{url_for(url)}\">#{name}</fb:help>"
end

#fb_if_is_app_user(user = nil, options = {}, &proc) ⇒ Object

Render if-is-app-user tag This tag renders the enclosing content only if the user specified has accepted the terms of service for the application. Use fb_if_user_has_added_app to determine wether the user has added the app. Example: <% fb_if_is_app_user(@facebook_user) do %>

  Thanks for accepting our terms of service!
<% fb_else do %>
  Hey you haven't agreed to our terms.  <%= link_to("Please accept our terms of service.", :action => "terms_of_service") %>
<% end %>

<% end %>



562
563
564
565
566
567
568
569
570
571
# File 'lib/facebooker/rails/helpers.rb', line 562

def fb_if_is_app_user(user=nil,options={},&proc)
  content = capture(&proc) 
  options = options.dup
  options.merge!(:uid=>cast_to_facebook_id(user)) if user
  if ignore_binding?
    concat(("fb:if-is-app-user",content,stringify_vals(options)))
  else
    concat(("fb:if-is-app-user",content,stringify_vals(options)),proc.binding)
  end
end

#fb_if_is_user(user, &proc) ⇒ Object

Render fb:if-is-user tag This tag only renders enclosing content if the user is one of those specified user can be a single user or an Array of users Example: <% fb_if_is_user(@check_user) do %>

     <%= fb_name(@facebook_user) %> are one of the users. <%= link_to("Check the other side", :action => "friend") %>
<% fb_else do %>
  <%= fb_name(@facebook_user) %>  are not one of the users  <%= fb_name(@check_user) %>
    <%= link_to("Check the other side", :action => "you") %>
<% end %>

<% end %>



604
605
606
607
608
609
610
611
612
613
# File 'lib/facebooker/rails/helpers.rb', line 604

def fb_if_is_user(user,&proc)
  content = capture(&proc) 
  user = [user] unless user.is_a? Array
  user_list=user.map{|u| cast_to_facebook_id(u)}.join(",")
  if ignore_binding?
    concat(("fb:if-is-user",content,{:uid=>user_list}))
  else
    concat(("fb:if-is-user",content,{:uid=>user_list}),proc.binding)
  end
end

#fb_if_user_has_added_app(user, options = {}, &proc) ⇒ Object

Render if-user-has-added-app tag This tag renders the enclosing content only if the user specified has installed the application

Example: <% fb_if_user_has_added_app(@facebook_user) do %>

  Hey you are an app user!
<% fb_else do %>
  Hey you aren't an app user.  <%= link_to("Add App and see the other side.", :action => "added_app") %>
<% end %>

<% end %>



583
584
585
586
587
588
589
590
591
# File 'lib/facebooker/rails/helpers.rb', line 583

def fb_if_user_has_added_app(user,options={},&proc)
  content = capture(&proc) 
  options = options.dup
  if ignore_binding?
    concat(("fb:if-user-has-added-app", content, stringify_vals(options.merge(:uid=>cast_to_facebook_id(user)))))
  else
    concat(("fb:if-user-has-added-app", content, stringify_vals(options.merge(:uid=>cast_to_facebook_id(user)))),proc.binding)
  end
end

#fb_iframe(src, options = {}) ⇒ Object



32
33
34
# File 'lib/facebooker/rails/helpers.rb', line 32

def fb_iframe(src, options = {})
   "fb:iframe", '', options.merge({ :src => src })
end

#fb_intl(text = nil, options = {}, &proc) ⇒ Object

Renders a fb:intl element

Example: <%= fb_intl(‘Age’, :desc => ‘Label for the age form field’, :delimiters => ‘[]’) %>

See wiki.developers.facebook.com/index.php/Fb:intl for more details

Raises:

  • (ArgumentError)


754
755
756
757
758
# File 'lib/facebooker/rails/helpers.rb', line 754

def fb_intl(text=nil, options={}, &proc)
  raise ArgumentError, "Missing block or text" unless block_given? or text
  content = block_given? ? capture(&proc) : text
  ("fb:intl", content, stringify_vals(options))
end

#fb_intl_token(name, text = nil, &proc) ⇒ Object

Renders a fb:intl-token element

Example: <%= fb_intl-token(‘number’, 5) %>

See wiki.developers.facebook.com/index.php/Fb:intl-token for more details

Raises:

  • (ArgumentError)


767
768
769
770
771
# File 'lib/facebooker/rails/helpers.rb', line 767

def fb_intl_token(name, text=nil, &proc)
  raise ArgumentError, "Missing block or text" unless block_given? or text
  content = block_given? ? capture(&proc) : text
  ("fb:intl-token", content, stringify_vals({:name => name}))
end

#fb_multi_friend_input(options = {}) ⇒ Object

Render an <fb:multi-friend-input> element See: wiki.developers.facebook.com/index.php/Fb:multi-friend-input for options



147
148
149
# File 'lib/facebooker/rails/helpers.rb', line 147

def fb_multi_friend_input(options={})
  tag "fb:multi-friend-input",stringify_vals(options)
end

#fb_multi_friend_request(type, friend_selector_message, url, &block) ⇒ Object

Create an fb:request-form with an fb_multi_friend_selector inside

The content of the block are used as the message on the form,

For example:

<% fb_multi_friend_request("Poke","Choose some friends to Poke",create_poke_path) do %>
  If you select some friends, they will see this message.
  <%= fb_req_choice("They will get this button, too",new_poke_path) %>
<% end %>


122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/facebooker/rails/helpers.rb', line 122

def fb_multi_friend_request(type,friend_selector_message,url,&block)
  content = capture(&block)
  if ignore_binding?
    concat(("fb:request-form",
                        fb_multi_friend_selector(friend_selector_message) + token_tag,
                        {:action=>url,:method=>"post",:invite=>true,:type=>type,:content=>content}
                        ))
  else
    concat(("fb:request-form",
                        fb_multi_friend_selector(friend_selector_message) + token_tag,
                        {:action=>url,:method=>"post",:invite=>true,:type=>type,:content=>content}
                        ),
          block.binding)
  end
end

#fb_multi_friend_selector(message, options = {}, &block) ⇒ Object

Render an <fb:multi-friend-selector> with the passed in welcome message Full version shows all profile pics for friends.

See: wiki.developers.facebook.com/index.php/Fb:multi-friend-selector for options Note: I don’t think the block is used here.



155
156
157
158
# File 'lib/facebooker/rails/helpers.rb', line 155

def fb_multi_friend_selector(message,options={},&block)
  options = options.dup
  tag("fb:multi-friend-selector",stringify_vals({:showborder=>false,:actiontext=>message,:max=>20}.merge(options)))
end

#fb_multi_friend_selector_condensed(options = {}, &block) ⇒ Object

Render a condensed <fb:multi-friend-selector> with the passed in welcome message Condensed version show checkboxes for each friend. See: wiki.developers.facebook.com/index.php/Fb:multi-friend-selector_%28condensed%29 for options Note: I don’t think the block is used here.



164
165
166
167
# File 'lib/facebooker/rails/helpers.rb', line 164

def fb_multi_friend_selector_condensed(options={},&block)
  options = options.dup
  tag("fb:multi-friend-selector",stringify_vals(options.merge(:condensed=>true)))
end

#fb_name(user, options = {}) ⇒ Object

Render an fb:name tag for the given user This renders the name of the user specified. You can use this tag as both subject and object of a sentence. See wiki.developers.facebook.com/index.php/Fb:name for full description.

Use this tag on FBML pages instead of retrieving the user’s info and rendering the name explicitly.



255
256
257
258
259
260
261
# File 'lib/facebooker/rails/helpers.rb', line 255

def fb_name(user, options={})
  options = options.dup
  options.transform_keys!(FB_NAME_OPTION_KEYS_TO_TRANSFORM)
  options.assert_valid_keys(FB_NAME_VALID_OPTION_KEYS)
  options.merge!(:uid => cast_to_facebook_id(user))
  ("fb:name",nil, stringify_vals(options))
end

#fb_narrow(&proc) ⇒ Object

Content for the narrow profile box goes in this tag



500
501
502
503
504
505
506
507
# File 'lib/facebooker/rails/helpers.rb', line 500

def fb_narrow(&proc)
  content = capture(&proc)
  if ignore_binding?
    concat(("fb:narrow", content, {}))
  else
    concat(("fb:narrow", content, {}), proc.binding)
  end
end

#fb_photo(photo, options = {}) ⇒ Object

Render an fb:photo tag. photo is either a Facebooker::Photo or an id of a Facebook photo or an object that responds to photo_id. See: wiki.developers.facebook.com/index.php/Fb:photo for complete list of options.



339
340
341
342
343
344
345
346
# File 'lib/facebooker/rails/helpers.rb', line 339

def fb_photo(photo, options={})
  options = options.dup
  options.assert_valid_keys(FB_PHOTO_VALID_OPTION_KEYS)
  options.merge!(:pid => cast_to_photo_id(photo))
  validate_fb_photo_size(options)
  validate_fb_photo_align_value(options)
  ("fb:photo",nil, stringify_vals(options))
end

#fb_profile_pic(user, options = {}) ⇒ Object

Render an <fb:profile-pic> for the specified user.

You can optionally specify the size using the :size=> option. Valid sizes are :thumb, :small, :normal and :square. Or, you can specify width and height settings instead, just like an img tag.

You can optionally specify whether or not to include the facebook icon overlay using the :facebook_logo => true option. Default is false.



323
324
325
326
327
328
329
330
# File 'lib/facebooker/rails/helpers.rb', line 323

def fb_profile_pic(user, options={})
  options = options.dup
  validate_fb_profile_pic_size(options)
  options.transform_keys!(FB_PROFILE_PIC_OPTION_KEYS_TO_TRANSFORM)
  options.assert_valid_keys(FB_PROFILE_PIC_VALID_OPTION_KEYS)
  options.merge!(:uid => cast_to_facebook_id(user))
  ("fb:profile-pic", nil,stringify_vals(options))
end

#fb_prompt_permission(permission, message, callback = nil) ⇒ Object

Renders a link that, when clicked, initiates a dialog requesting the specified extended permission from the user.

You can prompt a user with the following permissions:

* email
* read_stream
* publish_stream
* offline_access
* status_update
* photo_upload
* create_event
* rsvp_event
* sms
* video_upload
* create_note
* share_item

Example: <%= fb_prompt_permission(‘email’, “Would you like to receive email from our application?” ) %>

See wiki.developers.facebook.com/index.php/Fb:prompt-permission for more details. Correct as of 7th June 2009.

Raises:

  • (ArgumentError)


683
684
685
686
687
688
# File 'lib/facebooker/rails/helpers.rb', line 683

def fb_prompt_permission(permission,message,callback=nil)
  raise(ArgumentError, "Unknown value for permission: #{permission}") unless VALID_PERMISSIONS.include?(permission.to_sym)
  args={:perms=>permission}
  args[:next_fbjs]=callback unless callback.nil?
  ("fb:prompt-permission",message,args)
end

#fb_prompt_permissions(permissions, message, callback = nil) ⇒ Object

Renders a link to prompt for multiple permissions at once.

Example: <%= fb_prompt_permissions(, ‘Would you like to grant some permissions?’)



694
695
696
697
698
699
700
701
# File 'lib/facebooker/rails/helpers.rb', line 694

def fb_prompt_permissions(permissions,message,callback=nil)
  permissions.each do |p|
    raise(ArgumentError, "Unknown value for permission: #{p}") unless VALID_PERMISSIONS.include?(p.to_sym)          
  end
  args={:perms=>permissions*','}
  args[:next_fbjs]=callback unless callback.nil?
  ("fb:prompt-permission",message,args)        
end

#fb_pronoun(user, options = {}) ⇒ Object

Render an <fb:pronoun> tag for the specified user Options give flexibility for placing in any part of a sentence. See wiki.developers.facebook.com/index.php/Fb:pronoun for complete list of options.



276
277
278
279
280
281
282
# File 'lib/facebooker/rails/helpers.rb', line 276

def fb_pronoun(user, options={})
  options = options.dup
  options.transform_keys!(FB_PRONOUN_OPTION_KEYS_TO_TRANSFORM)
  options.assert_valid_keys(FB_PRONOUN_VALID_OPTION_KEYS)
  options.merge!(:uid => cast_to_facebook_id(user))
  ("fb:pronoun",nil, stringify_vals(options))
end

#fb_ref(options) ⇒ Object

Render an fb:ref tag.

Options must contain either url or handle.

  • url The URL from which to fetch the FBML. You may need to call fbml.refreshRefUrl to refresh cache

  • handle The string previously set by fbml.setRefHandle that identifies the FBML

See wiki.developers.facebook.com/index.php/Fb:ref for complete description



293
294
295
296
297
298
# File 'lib/facebooker/rails/helpers.rb', line 293

def fb_ref(options)
  options.assert_valid_keys(FB_REF_VALID_OPTION_KEYS)
  validate_fb_ref_has_either_url_or_handle(options)
  validate_fb_ref_does_not_have_both_url_and_handle(options)
  tag("fb:ref", stringify_vals(options))
end

#fb_req_choice(label, url) ⇒ Object

Render a button in a request using the <fb:req-choice> tag url must be an absolute url This should be used inside the block of an fb_multi_friend_request



172
173
174
# File 'lib/facebooker/rails/helpers.rb', line 172

def fb_req_choice(label,url)
  tag "fb:req-choice",:label=>label,:url=>url
end

#fb_request_form(type, message_param, url, options = {}, &block) ⇒ Object

Create an fb:request-form without a selector

The block passed to this tag is used as the content of the form

The message param is the name sent to content_for that specifies the body of the message

For example,

<% content_for("invite_message") do %>
  This gets sent in the invite. <%= fb_req_choice("with a button!",new_poke_path) %>
<% end %>
<% fb_request_form("Poke","invite_message",create_poke_path) do %>
  Send a poke to: <%= fb_friend_selector %> <br />
  <%= fb_request_form_submit %>
<% end %>


83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/facebooker/rails/helpers.rb', line 83

def fb_request_form(type,message_param,url,options={},&block)
  content = capture(&block)
  message = @template.instance_variable_get("@content_for_#{message_param}")
  if ignore_binding?
    concat(("fb:request-form", content + token_tag,
              {:action=>url,:method=>"post",:invite=>true,:type=>type,:content=>message}.merge(options)))
  else
    concat(("fb:request-form", content + token_tag,
              {:action=>url,:method=>"post",:invite=>true,:type=>type,:content=>message}.merge(options)),
          block.binding)
  end
end

#fb_request_form_submit(options = {}) ⇒ Object

Create a submit button for an <fb:request-form> If the request is for an individual user you can optionally Provide the user and a label for the request button. For example

<% content_for("invite_user") do %>
  This gets sent in the invite. <%= fb_req_choice("Come join us!",new_invite_path) %>
<% end %>
<% fb_request_form("Invite","invite_user",create_invite_path) do %>
  Invite <%= fb_name(@facebook_user.friends.first.id)%> to the party <br />
  <%= fb_request_form_submit(:uid => @facebook_user.friends.first.id, :label => "Invite %n") %>
<% end %>

See: wiki.developers.facebook.com/index.php/Fb:request-form-submit for options



108
109
110
# File 'lib/facebooker/rails/helpers.rb', line 108

def fb_request_form_submit(options={})
   tag("fb:request-form-submit",stringify_vals(options))
end

#fb_serverfbml(options = {}, &proc) ⇒ Object

Renders the FBML on a Facebook server inside an iframe.

Meant to be used for a Facebook Connect site or an iframe application



726
727
728
729
# File 'lib/facebooker/rails/helpers.rb', line 726

def fb_serverfbml(options={},&proc)
  inner = capture(&proc)
  concat(("fb:serverfbml",inner,options),&proc.binding)
end

#fb_share_button(url) ⇒ Object

Renders a standard ‘Share’ button for the specified URL.



719
720
721
# File 'lib/facebooker/rails/helpers.rb', line 719

def fb_share_button(url)
   "fb:share-button",nil,:class=>"url",:href=>url
end

#fb_show_feed_dialog(action, user_message = "", prompt = "", callback = nil) ⇒ Object



61
62
63
64
65
# File 'lib/facebooker/rails/helpers.rb', line 61

def fb_show_feed_dialog(action, user_message = "", prompt = "", callback = nil)
  update_page do |page|
    page.call "Facebook.showFeedDialog",action.template_id,action.data,action.body_general,action.target_ids,callback,prompt,user_message
  end
end

#fb_success(message, text = nil) ⇒ Object

Render an <fb:success> tag If message and text are present then this will render fb:error and fb:message tag TODO: Optionally takes a decoration tag with value of ‘no_padding’ or ‘shorten’



446
447
448
# File 'lib/facebooker/rails/helpers.rb', line 446

def fb_success(message, text=nil)
  fb_status_msg("success", message, text)
end

#fb_swf(src, options = {}) ⇒ Object



36
37
38
# File 'lib/facebooker/rails/helpers.rb', line 36

def fb_swf(src, options = {})
  tag "fb:swf", options.merge(:swfsrc => src)
end

#fb_tab_item(title, url, options = {}) ⇒ Object

Render an fb:tab_item tag. Use this in conjunction with fb_tabs Options can contains :selected => true to indicate that a tab is the current tab. See: wiki.developers.facebook.com/index.php/Fb:tab-item for complete list of options



379
380
381
382
383
384
385
# File 'lib/facebooker/rails/helpers.rb', line 379

def fb_tab_item(title, url, options={})
  options= options.dup
  options.assert_valid_keys(FB_TAB_ITEM_VALID_OPTION_KEYS)
  options.merge!(:title => title, :href => url)    
  validate_fb_tab_item_align_value(options)
  tag("fb:tab-item", stringify_vals(options))
end

#fb_tabs(&block) ⇒ Object

Render an fb:tabs tag containing some number of fb:tab_item tags. Example: <% fb_tabs do %>

<%= fb_tab_item("Home", "home") %>
<%= fb_tab_item("Office", "office") %>

<% end %>



366
367
368
369
370
371
372
373
# File 'lib/facebooker/rails/helpers.rb', line 366

def fb_tabs(&block)
  content = capture(&block)
  if ignore_binding?
    concat(("fb:tabs", content))
  else
    concat(("fb:tabs", content), block.binding)
  end
end

#fb_time(time, options = {}) ⇒ Object

Renders an fb:time element

Example: <%= fb_time(Time.now, :tz => ‘America/New York’, :preposition => true) %>

See wiki.developers.facebook.com/index.php/Fb:time for more details



743
744
745
# File 'lib/facebooker/rails/helpers.rb', line 743

def fb_time(time, options={})
  tag "fb:time",stringify_vals({:t => time.to_i}.merge(options))
end

#fb_title(title) ⇒ Object

Adds a title to the title bar

Facebook | App Name | This is the canvas page window title

title: This is the canvas page window



540
541
542
# File 'lib/facebooker/rails/helpers.rb', line 540

def fb_title(title)
 "<fb:title>#{title}</fb:title>"
end

#fb_user_status(user, linked = true) ⇒ Object

Returns the status of the user



714
715
716
# File 'lib/facebooker/rails/helpers.rb', line 714

def fb_user_status(user,linked=true)
   "fb:user-status",nil,stringify_vals(:uid=>cast_to_facebook_id(user), :linked=>linked)
end

#fb_wall(&proc) ⇒ Object

Create a Facebook wall. It can contain fb_wall_posts

For Example:

<% fb_wall do %>
  <%= fb_wall_post(@user,"This is my message") %>
  <%= fb_wall_post(@otheruser,"This is another message") %>
<% end %>


413
414
415
416
417
418
419
420
# File 'lib/facebooker/rails/helpers.rb', line 413

def fb_wall(&proc)
  content = capture(&proc)
  if ignore_binding?
    concat(("fb:wall",content,{}))
  else
    concat(("fb:wall",content,{}),proc.binding)
  end
end

#fb_wallpost(user, message) ⇒ Object Also known as: fb_wall_post

Render an <fb:wallpost> tag TODO: Optionally takes a time parameter t = int The current time, which is displayed in epoch seconds.



424
425
426
# File 'lib/facebooker/rails/helpers.rb', line 424

def fb_wallpost(user,message)
  ("fb:wallpost",message,:uid=>cast_to_facebook_id(user))
end

#fb_wide(&proc) ⇒ Object

Content for the wide profile box goes in this tag



490
491
492
493
494
495
496
497
# File 'lib/facebooker/rails/helpers.rb', line 490

def fb_wide(&proc)
  content = capture(&proc)
  if ignore_binding?
    concat(("fb:wide", content, {}))
  else
    concat(("fb:wide", content, {}), proc.binding)
  end
end

#fbjs_libraryObject



27
28
29
30
# File 'lib/facebooker/rails/helpers.rb', line 27

def fbjs_library
  "<script>var _token = '#{form_authenticity_token}';var _hostname = '#{ActionController::Base.asset_host}'</script>"+
  "#{javascript_include_tag 'facebooker'}"
end

#validate_fb_photo_align_value(options) ⇒ Object



395
396
397
398
399
# File 'lib/facebooker/rails/helpers.rb', line 395

def validate_fb_photo_align_value(options)
  if options.has_key?(:align) && !VALID_FB_PHOTO_ALIGN_VALUES.include?(options[:align].to_sym)
    raise(ArgumentError, "Unknown value for align: #{options[:align]}")
  end
end

#validate_fb_ref_does_not_have_both_url_and_handle(options) ⇒ Object



306
307
308
309
310
# File 'lib/facebooker/rails/helpers.rb', line 306

def validate_fb_ref_does_not_have_both_url_and_handle(options)
  if options.has_key?(:url) && options.has_key?(:handle)
    raise ArgumentError, "fb_ref may not have both :url and :handle"
  end
end

#validate_fb_ref_has_either_url_or_handle(options) ⇒ Object



300
301
302
303
304
# File 'lib/facebooker/rails/helpers.rb', line 300

def validate_fb_ref_has_either_url_or_handle(options)
  unless options.has_key?(:url) || options.has_key?(:handle)
    raise ArgumentError, "fb_ref requires :url or :handle"
  end
end

#validate_fb_tab_item_align_value(options) ⇒ Object



389
390
391
392
393
# File 'lib/facebooker/rails/helpers.rb', line 389

def validate_fb_tab_item_align_value(options)
  if options.has_key?(:align) && !VALID_FB_TAB_ITEM_ALIGN_VALUES.include?(options[:align].to_sym)
    raise(ArgumentError, "Unknown value for align: #{options[:align]}")
  end
end