2013-02-04 3 views
0

Мне недавно было поручено загрузить часть моего приложения Rails в iframe на другом веб-сайте. На соответствующих страницах должен использоваться другой файл макета, но только если они отображаются внутри iframe. Было предложено решение Detect iframe request in a rails app, в котором используется параметр строки запроса.Rails 3 DRY Условная компоновка для iframes

Например, запрашивающий веб-сайт может вызвать мое приложение через iframe с помощью src http://foo.com/bar?iframe=true. Тогда в нашем контроллере мы могли бы просто проверить:

def bar 
    render :template => "iframe" if params[:iframe] 
end 

Это кажется хорошим решением, но, к сожалению, который работает только для первоначального запроса, как исходная строка запроса полностью статичная. Предполагая, что у нас есть доступные ссылки на другие маршруты в iframe, есть ли способ легко передать параметр запроса iframe=true для поддержания правильного макета iframe без повторения кода? В принципе, я хотел бы использовать подход DRYest, не нарушая никаких существующих функций. Я подумал о создании еще одного link_to помощника, который включал логику для ретрансляции этого параметра, если он существует, и заменяет все мои вызовы link_to во время моего приложения; Мне было интересно, есть ли у кого-то лучший подход.

ответ

1

я решил решить эту проблему с помощью JavaScript и добавил следующее в мой файл макета Haml:

:javascript 
    for(i = 0; i< $('a').length; i++) 
    { 
     if($('a')[i].href.match(document.domain)) 
     { 
     $('a')[i].href = $('a')[i].href + "?iframe=true"; 
     } 
    } 

Это в сочетании с моей стороны сервера проверки для IFrame парам будет гарантировать, что загружена соответствующая раскладка. Я решил использовать эту функцию только для пользователей, которые используют JavaScript, поэтому это может быть не лучшее решение. Единственная другая проблема с этим подходом заключается в перенаправлении и формах контроллера, где я должен вручную проверять параметр iframe, а затем перенаправить его соответственно, а не DRY вообще, но я, по крайней мере, мог поместить логику в метод контроллера. Если кто-то знает о лучшем решении, не стесняйтесь оставлять ответ.

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