0

Я занимаюсь созданием приложения facebook, которое работает через iFrame с Ruby On Rails.Вычисление клиентов facebook iFrame

Мое приложение обслуживает несколько клиентов, сеть, мобильный и фейсбук. И в зависимости от типа клиента пользовательский интерфейс отображает разные виды просмотров.

Когда пользователь подключается к моему приложению, используя вкладку страницы facebook, я получаю достаточно информации (в коллекции params), чтобы определить, что пользователь пришел из facebook. Исходя из этого, я могу настроить представления, чтобы вписаться в iFrame.

Но для последующих запросов, поскольку они происходят через iframe, нет ничего, что говорит о том, что это запрос на facebook (насколько я могу судить, если в заголовках нет чего-то, о чем я не знаю).

Я попытался установить cookie во время первого запроса, и это сработало отлично. Но проблема в том, что пользователь запросил мое приложение непосредственно с другой вкладки браузера (а не через facebook), файл cookie все еще присутствовал, и пользователь в итоге увидел пользовательский интерфейс facebook (ised), а не обычный пользовательский интерфейс.

У кого-нибудь есть решение?

ответ

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. Так что, если ваши обычные URL-адреса выглядеть следующим образом:

/foobar 

Затем вы можете использовать что-то вроде этого для Facebook, добавив префикс «/ FB» (или аналогичный) на вкладке или холст Facebook приложения URL:

/fb/foobar 

На ваших маршрутах.rb вы можете передать параметр, чтобы указать, что пользователь просматривает страницу на Facebook, например «channel = facebook» или «facebook = true».

Ваш routes.rb может выглядеть примерно так:

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

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

С помощью этих маршрутов, каждый запрос происходящий от Facebook будет автоматически иметь «канал = фейсбук» параметр. Конечно, вы все равно несете ответственность за сбор соответствующих URL-адресов в своем приложении. Вы можете добавить :as => 'facebook' и :as => web в области, указанные выше, и использовать их для создания URL-адресов с использованием выделенных помощников (например, facebook_foobar_url, web_foobar_url). Но лучший способ сделать это во многом зависит от сложности вашего приложения.

В качестве альтернативы вы также можете использовать default_url_options в своем контроллере для добавления параметра «channel = facebook» или «facebook = true» для каждого сгенерированного URL-адреса, если вы обнаружите, что текущий запрос возник из Facebook (либо из-за существования signed_request или с добавленного параметра channel/facebook). Обратите внимание, что этот метод устарел в Rails 3, и я не совсем уверен, что (если есть) официальная замена находится в Rails 3.1 или 3.2.

+0

Спасибо за ответы , Я немного запутался в реальной реализации. Должен ли каждый запрос содержать facebook = true param? – thanikkal

+0

Вручную добавление этого параметра не то, что я имел в виду, хотя это еще один вариант. Я отредактировал сообщение, чтобы добавить некоторые подробности для моего первоначального предложения, а также альтернативу, которая включает такой параметр. –

+0

Мирко, я решил это немного по-другому. Детали смотрите ниже. +1 и спасибо за ваше предложение. Это может помочь кому-то найти похожие проблемы. Благодаря! – thanikkal

 Смежные вопросы

  • Нет связанных вопросов^_^