0

私はRuby On RailsでiFrameを使って動作するfacebookアプリを構築中です。facebook iFrameクライアントの把握

私のアプリは、複数のクライアント、ウェブ、モバイル、およびFacebookのサービスを提供しません。そして、クライアントのタイプに応じて、UIは異なる種類のビューをレンダリングします。

ユーザーがFacebookのページのタブを使用して私のアプリに接続し

は、私はFacebookのから来たユーザーを識別するために(のparamsコレクション内の)十分な情報を入手できます。それに基づいて、iFrameに収まるようにビューをカスタマイズすることができます。

しかし、その後のリクエストでは、iframeで発生するため、これはFacebookのリクエストです(ヘッダーにはわからない限り、私には分かります)。

私は、最初の要求時にCookieを設定しようと、それがとてもうまくいきました。しかし、問題は、ユーザーがCookieがまだ存在し、ユーザーが通常のUIの代わりにfacebook(ised)UIを見てしまうという別のブラウザのタブ(Facebook経由ではない)から直接アプリケーションを要求したときです。

誰でもこれに対応していますか?

答えて

0

私は、既存のコードへの侵入の最低額でこれを解決するために必要。 同様の問題を解決しようとする人のために私のソリューションをここに掲載しています。

私はFacebookのためのユニークなレイアウトを持っており、これは(私は上記のように、Facebookのタブから投稿最初の要求は、Facebookののparamsを持っている)最初の要求時に呼び出されました。 Facebookのレイアウト内で、後続のリクエストにFacebookのパラメータが存在することを確認するために、フォームのサブミットとアンカーのクリックイベントをそれぞれ非表示のフォーム要素とクエリ文字列paramを追加するメソッドにバインドしました。

:そのようなredirect_toメソッドを拡張するために必要な、(あなたがなどのリソースを更新したときの典型的な)

<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> 

今すぐサーバー側のリダイレクトを処理するために:

これは、クライアント側のコードがどのように見えるかです

/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アプリのタブまたはキャンバスURLに「/ FB」プレフィックス(または類似)を追加することによって、Facebookのためにこのようなものを使用することもできます。:

だからあなたの通常のURLは次のようになり場合
/fb/foobar 

routes.rbに「channel = facebook」や「facebook = true」などのユーザーがFacebook上でページを表示していることを示すパラメータを渡すことができます。

あなたのroutes.rbをこのようになります。これらのルートで

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

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

は、Facebookのから発信各要求は、自動的に「チャネル= Facebookの」パラメータを持つことになります。もちろん、アプリ内に適切なURLを生成するようにする責任はあなたにあります。あなたは上記のスコープに:as => 'facebook':as => webを追加し、専用のヘルパー(例えばfacebook_foobar_urlweb_foobar_url)を使用してURLを生成するためにこれを使用することができます。しかし、これを実行する最良の方法は、アプリの複雑さに大きく依存します。

また、コントローラーにdefault_url_optionsを使用して、生成されたすべてのURLに「channel = facebook」または「facebook = true」パラメーターを追加することもできます。 signed_requestまたは追加したチャンネル/ facebook paramから)。このメソッドはRails 3では推奨されていないことに注意してください。正式な置き換えがRails 3.1または3.2にあるかどうかはわかりません。

+0

感謝答えるため。私は実際の実装ではほとんど混乱していません。すべてのリクエストにfacebook = true paramが含まれている必要がありますか? – thanikkal

+0

手動でこのパラメータを追加することは、別のオプションですが、私が気にしていたことではありません。私はオリジナルの提案のためのいくつかの詳細とそのようなパラメータを含む代替案を追加するために投稿するように編集しました。 –

+0

ミルコ、私はこの少し違って解決した。詳しくは下記をご覧ください。 +1していただきありがとうございます。これは、同様の問題を解決しようとする人に役立つかもしれません。ありがとう! – thanikkal

関連する問題