Wyświetlenie zewnętrznego HTML z open-uri w iframe

Cześć,

  1. Jeśli się odpowiednio spreparuje linka do arkusza kalkulacyjnego w Google Drive to się dostanie ładny html.

  2. Poprzez open-uri pobieram ten HTML i pakuję do zmiennej.
    W kontrolerze:

    before_filter :read_content
    def read_content
    @page_content = open(‘https://docs.google.com/a/captatio.pl/spreadsheets/d/1pS1yL6Uiz3KwwYBLABLABLA’).read
    end

  3. Potem w widoku jeśli wywołam @page_content wywala mi ładnie tego HTML w postaci kodu HTML, którego oczywiście przeglądarka nie przetwarza.

  4. Jeśli spróbuję to dać jako SRC dla iframe:

    %iframe{:width => “100%”,:height => “500px”, :src => “#{@page_content.html_safe}”}
    to dostaję błąd:

    No route matches [GET] “/%3C!DOCTYPE%20html%20PUBLIC%20%22-/W3C/DTD%20HTML%204.01/EN%22%3E%3Chtml%3E%3Chead%3E%3CMETA%20http-equiv=%22Content-Type%22%20content=%22text/html”

Nie chcę wpisywać bezpośrednio linka do tego URLa w iframe (co działa), bo nie chcę aby ten link był widoczny w źródle strony. Poza tym w linku muszę odpowiednio spreparować zapytanie, które zwróci mi wiersze arkusza kalkulacyjnego o okreśłonych parametraich. Więc musiałbym tworzyć wariantowo iframe’y co nie jest zbytnio optymalne. Wolę to zrobić na poziomie funkcji i tylko kazać iframe’owi to wyświetlić, tylko problem w tym, że railsy robią coś dziwnego…

Z góry dzięki za pomoc.

Nie możesz użyć do tego atrybutu src, gdyż on służy do wskazania źródła a nie treści. Jak widzisz przeglądarka próbuje wykonać żądanie pod adres, który jest początkiem treści Twojej strony.

Musisz utworzyć pusty iframe (src=“about:blank”) i javascriptem wpakować treść do niego. Np. tak:

<iframe id="myiframe" src="about:blank"></iframe>
<script type="text/javascript">
var doc = document.getElementById('myiframe').contentWindow.document;
doc.open();
doc.write('<html><head><title></title></head><body>Hello world.</body></html>');
doc.close();
</script>

Ahh faktycznie.
No właśnie chciałem zupełnie uniknąć javascriptu. A gdyby tak… zrobić kontroler, który by zwracał tego htmla? To wtedy pewnie mógłbym się w src odwołać do “własnego” adresu url…

Hehe. Wystarczyło zamienić iframe na DIVa i:

%div{:width => "100%",:height => "500px"}
    = raw read_content