Próbuję wygenerować odpowiedź JSON, która zawiera kod HTML. Tak więc mam /app/views/foo/bar.json.erb
:
{
someKey: 'some value',
someHTML: "<%= h render(:partial => '/foo/baz') -%>"
}
Chcę, aby renderował /app/views/foo/_baz.html.erb
, ale będzie to renderować tylko /app/views/foo/_baz.json.erb
. Podawanie :format => 'html'
nie pomaga.
ruby-on-rails
format
render
partial
actionview
James A. Rosen
źródło
źródło
Odpowiedzi:
Począwszy od Railsów 3.2.3, podczas wywoływania render: parts (działa tylko poza
respond_to
blokiem).zamiast
źródło
:format
opcja praca. Dzięki!:content_type
w niektórych przypadkach może być konieczne określenie tej opcji - np. Renderowanie szablonu HTML z wnętrzaformat.pdf
bloku można wykonać tylko za pomocąrender "template", formats: [:html], content_type: "text/html"
. Potrzebuję tego, ponieważ zezwalam na bezpośrednie pobieranie próbek moich książek tylko dla członków mojej listy e-mailowej - zwykli goście otrzymują zamiast tego formularz rejestracyjny.co jest źle z
? Właśnie próbowałem tego wyrenderować część HTML ERB z wnętrza szablonu Atom builder i działało dobrze. Nie trzeba bawić się zmiennymi globalnymi (tak, wiem, że mają przed sobą znak „@”, ale tym właśnie są).
Twoje
with_format &block
podejście jest jednak fajne i ma tę zaletę, że określasz tylko format, podczas gdy proste podejście określa również silnik szablonu (ERB / builder / etc).źródło
baz.en.html.erb
,baz.fr.html.erb
) i chceszrender :partial
s logikę wyborze jednego (z fallbacks, etc).DEPRECATION WARNING: Passing a template handler in the template name is deprecated. You can simply remove the handler name or pass render :handlers => [:erb] instead.
foo.baz.html.[your_string]
zamiastfoo.baz.[your_string]
. odpowiedzią zgchurc jest lepsze rozwiązanie.W Railsach 3 blok with_format działa, ale jest trochę inny:
źródło
Rails 4 pozwolą ci na przekazanie parametru formatów. Więc możesz to zrobić
Zauważ, że możesz zrobić coś podobnego w Railsach 3, ale nie przekaże tego formatu do żadnych części podrzędnych (jeśli formularz wywoła inne części podrzędne).
Możesz mieć możliwość Rails 4 w Railsach 3, tworząc config / initializers / renderer.rb:
Zobacz http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific-format/
źródło
Opierając się na odpowiedzi Roninka , znalazłem najlepsze rozwiązanie:
w /app/helpers/application.rb:
W /app/views/foo/bar.json:
Alternatywnym rozwiązaniem byłaby zmiana definicji w
render
celu zaakceptowania:format
parametru.Nie mogłem
render :file
pracować z lokalnymi mieszkańcami i bez pewnej chwiejnej ścieżki.źródło
W Railsach 3 widok ma tablicę formatów, co oznacza, że możesz ustawić, aby szukał [: mobile,: html]. Ustawienie to będzie domyślnie szukać: szablonów mobilnych, ale wróci do: szablonów html. Skutki ustawienia tego ustawienia spadną kaskadowo do wewnętrznych części składowych.
Najlepszym, ale wciąż wadliwym sposobem, jaki mogłem znaleźć, aby to ustawić, było umieszczenie tej linii na górze każdego pełnego szablonu mobilnego (ale nie częściowego).
Wada polega na tym, że musisz dodać tę linię do wielu szablonów. Jeśli ktoś zna sposób, aby to ustawić raz, z application_controller.rb, chciałbym to wiedzieć. Niestety dodanie tej linii do układu mobilnego nie działa, ponieważ szablony są renderowane przed układem.
źródło
Rozwijając tylko to, co napisał zgchurch:
Pomyślałem, że to może być przydatne.
źródło
Masz dwie możliwości:
1) użycie
render :file
2) zmień format szablonu na html, ustawiając zmienną @template_format
źródło
Miałem plik o nazwie „api / item.rabl” i chciałem go wyrenderować z widoku HTML, więc musiałem użyć:
render file: 'api/item', formats: [:json]
(
file
ponieważ plik nie ma podkreślenia w nazwie,formats
a nieformat
(i przebiegach i tablicy))źródło
Wygląda na to, że przekazanie
formats
opcji wyrenderuje ją poprawnie w nowszej wersji Railsów, co najmniej 3.2:źródło
Natknąłem się na ten wątek, gdy próbowałem renderować część XML w innym pliku widoku xml.builder. Podążanie to dobry sposób na zrobienie tego
I tak ... Pełna nazwa pliku też działa tutaj ...
źródło