2013-01-11 11 views
14

Po prostu wypróbowanie prostej aplikacji do obsługi railsów, w większości przeznaczonych dla zaplecza API z JSON-em, aplikacją dla grubych klientów. Więc to, co chcę zrobić, to renderować tylko układ i mieć kod javascript, który obsługuje adres URL, i wykonać żądanie ajaxowe, aby uzyskać dane json. Wydaje się, że działa:Tylko układ renderowania Railsów?

respond_to do |format| 
    format.html { render :nothing => true, :layout => true } 
end 

Jednak ponieważ nic nie ma na celu nic nie odpłacać, to wydaje się, że jest źle. Czy istnieje lepszy sposób renderowania układu? Zwróć uwagę, że mój układ nie ma wydajności.

Odpowiedz

3

Wypróbuj, spowoduje wyświetlenie odpowiedzi na plik o nazwie sample.html, który może być statycznym plikiem html.

a także można mieć ten plik w wspólnej lokalizacji, tak aby można było załadować go do wszystkich działań

mają swoją zawartość statyczną na tej stronie, a jeśli trzeba dynamiczną stronę można mieć .erb strona zbyt

w swojej metodzie

def index 
    @posts = Post.all 

    respond_to do |format| 
     format.html {render :file => "posts/sample"} 
     format.json { render json: @posts } 
    end 
end 

/post/sample.html 

HTH

+0

Moją obawą jest zwrócenie niepotrzebnych danych. Myślałem o ': text =>" "jako opcji, ale znowu potrzebujesz': layout => true', ponieważ domyślnie renderuje tylko tekst. – agmcleod

+0

Nie możesz mieć pustej strony statycznej html z wiadomością (lub czymś) lub możesz wyjaśnić, co użytkownik musi zobaczyć, gdy trafi w tę akcję! (lub wszystkie css i js w pliku statycznym i bez użycia układu) – sameera207

+0

To może również zadziałać :). Mój współpracownik sugerował również, aby robić aspekt frontalny w sinatrze, a szyny były czystym API. – agmcleod

0

Wierzę, że jeśli twoja aplikacja pobiera właśnie JSON z serwera, format powinien być: json, a nie html.

respond_to do |format| 
    format.json @your_collection 
end 

Lub umieść format dla wszystkich akcji w kontrolerze i po prostu odpowiedz obiektami.

+0

Problemem, który reaguje na regularnych adresów URL. Nie chcę duplikować widoków Haml & JST. Załóżmy, że mam prosty blog z kontrolerem postów. Aby uzyskać bezpośredni dostęp do wpisu, należy przejść do '/ posts/1'. To, co musi zrobić, to renderować układ. Jeśli po prostu odpowiadam za pomocą JSON, a ja nie mówię nic o odpowiedzi HTML, to '/ posts/1' zgłasza błąd szablonu. – agmcleod

+0

Hmm, sądziłem, że poradzisz sobie z kodem DOM za pomocą tylko javascript. Tak jak zamiana html na podstawie json z serwera. – MurifoX

+0

Możesz. Ale wtedy staje się trudniejsze, gdy próbuje zastąpić treści za pomocą kliknięć linków, a co nie. Gdy aplikacja staje się większa, komplikuje się. Próbuję ominąć ten sposób myślenia i zdobyć trochę praktyki w tym stylu, więc mogę rozwinąć tę aplikację w coś. – agmcleod

5
render :file => "layout_file", :layout => false 
+0

To także interesująca opcja. Zastanawiam się, czy jest jakiś minus dla szyn, nie myśląc, że to układ. – agmcleod

25

Cóż, to pracował dla mnie w Rails 4.0:

render :text => "", :layout => true 
+0

To wydaje się po prostu hackowskim sposobem renderowania układu bez wprowadzania danych. – Jay

+3

To spowoduje wyświetlenie ostrzeżenia o wycofaniu w Rails 5. Możesz użyć 'render html: '', layout: true', aby osiągnąć ten sam wynik. – Sebastian

4

potrzebowałem czegoś similar-- aby wyświetlić szablon układ z częściowym (gdzie nie partials są obsługiwane stronie klienta).

rails 4.2.0

respond_to do |format| 
    format.html { render text: nil, layout: true } 
end 
+0

Chociaż ta odpowiedź jest prawdopodobnie poprawna i użyteczna, zaleca się, aby wraz z nią wyjaśnić, w jaki sposób pomaga rozwiązać problem. Staje się to szczególnie przydatne w przyszłości, jeśli nastąpi zmiana (prawdopodobnie niezwiązana ze sobą), która powoduje, że przestaje działać, a użytkownicy muszą zrozumieć, w jaki sposób działał. –

0

(Kopiowanie komentarz Vasile dla lepszej widoczności.)

Na szynach 5.1, w celu usprawnienia układu bez konieczności szablon widoku, trzeba użyć

def index 
    render html: '', layout: true 
end 

lub z układem niestandardowym

def index 
    render html: '', layout: 'mylayout' 
end 

Poniższa nie zadziała:

render text: '', layout: 'mylayout' daje błąd, ponieważ szablon widoku index.html.haml nie istnieje.

spowoduje błąd, ponieważ nothing:true jest przestarzałe, a szablon index nie istnieje (jednak działa to w szynach 4.2)

render body: '', layout: 'mylayout' odda '' (brak układu)

render plain: '', layout: 'mylayout' odda '' (brak układu)

Powiązane problemy