0

我正在構建一個通過iFrame和Ruby On Rails一起工作的Facebook應用程序。搞定facebook iFrame客戶端

我的應用程序確實服務於多個客戶端,網絡,移動和Facebook。取決於客戶端的類型,UI呈現不同類型的視圖。

當用戶使用Facebook頁面標籤連接到我的應用程序時,我確實獲得了足夠的信息(在params集合中)來標識用戶來自Facebook。基於此,我可以自定義視圖以適應iFrame。

但是對於後續的請求,因爲它們通過iframe發生,沒有任何東西告訴這是一個facebook請求(據我所知,除非在標題中有某些我不知道的東西)。

我試着在第一次請求期間設置一個cookie,並且工作得很好。但問題是,當用戶直接從另一個瀏覽器選項卡(而不是通過Facebook)請求我的應用程序時,Cookie仍然存在,用戶最終看到Facebook(ised)UI,而不是Normal UI。

任何人都有解決方案?

回答

0

我需要用最少量的入侵來解決這個問題。 我在這裏發佈我的解決方案,爲任何希望解決類似問題的人帶來益處。

我有一個獨特的Facebook佈局,這是在第一個請求期間調用的(就像我上面提到的,從facebook標籤發佈的初始請求有facebook參數)。 爲了確保後續請求中有Facebook參數,在facebook佈局中,我將所有表單提交和錨點單擊事件綁定到一個方法,該方法將分別添加隱藏的表單元素和查詢字符串參數。

這是客戶端代碼的樣子:

<script type="text/javascript"> 
    $(document).ready(function() { 
    $('form').submit(function(e) { 


     $('<input>').attr({ 
    type: 'hidden', 
    id: 'fb_param', 
    name: 'fb_param', 
    value: 'true' 
}).appendTo($(this)); 

    return true; 
    }); 
    $('a').click(function(e) {   
     var newUrl = $(this).attr("href"); 
     if (newUrl.indexOf("?") != -1) { 
      newUrl = newUrl + '&fb_param=true'; 
     } else { 
      newUrl = newUrl + '?fb_param=true';     
     } 
     $(this).attr("href", newUrl); 
    return true; 
    }); 
    }); 
    </script> 

我們處理服務器端重定向(典型的,當你更新資源等),延長redirect_to的方法,像這樣需要:

回答

/app/conntrollers/application_controller.rb

class ApplicationController < ActionController::Base 

    def redirect_to(options = {}, response_status = {}) 
    if params[:fb_param] == 'true' 
     if options 
     if options.is_a?(Hash) 
      options["fb_param"] = "true" 
     else 
      if options.include? "?" 
      options = "#{options}&fb_param=true" 
      else 
      options = "#{options}?fb_param=true" 
      end 
     end 
     end 
    end 

    super 

    end 

end 
1

我建議爲Facebook標籤使用不同的路由。所以,如果你的正常的網址是這樣的:

/foobar 

那麼你可能要爲Facebook,通過添加「/ FB」前綴(或類似)到您的Facebook應用程序的選項卡或帆布URL中使用這樣的事情:

/fb/foobar 

在您的routes.rb中,您可以傳遞一個參數來指示用戶正在Facebook上查看該頁面,如「channel = facebook」或「facebook = true」。

你的routes.rb可能是這個樣子:

scope 'fb', :channel => 'facebook' do 
    # ... your routes ... 
end 

scope :channel => 'web' do 
    # ... your routes ... 
end 

通過這些途徑,每個請求從Facebook發起將自動獲得一個「通道=臉譜」參數。當然,您仍然有責任確保在您的應用內生成適當的網址。您可以將:as => 'facebook':as => web添加到上面的範圍,並使用它來使用專用幫助程序生成URL(例如facebook_foobar_url,web_foobar_url)。但是,最好的辦法很大程度上取決於你的應用程序的複雜性。

另外,您也可以使用default_url_options在控制器的「通道=臉譜」或「臉譜=真正的」參數,如果你檢測當前請求源於Facebook的(無論是從一個存在添加到每個生成的URL signed_request或從您添加的頻道/ Facebook參數)。請注意,此方法在Rails 3中已棄用,我不太確定Rails 3.1或3.2中的官方替換是什麼(如果有的話)。

+0

謝謝。我對實際的實現有點困惑。應該每個請求都包含facebook = true參數嗎? – thanikkal 2012-02-26 09:36:20

+0

手動添加此參數不是我想到的,儘管它是另一種選擇。我已編輯過,以便爲我的原始建議添加一些更多細節,以及涉及此類參數的替代方案。 – 2012-02-26 17:44:43

+0

Mirko,我最終解決了這個問題。請參閱下面的詳細信息。 +1並感謝您的建議。它可能會幫助有人尋求解決類似的問題。謝謝! – thanikkal 2012-03-09 09:10:02