Estou tentando gerar uma resposta JSON que inclui algum HTML. Assim, tenho /app/views/foo/bar.json.erb
:
{
someKey: 'some value',
someHTML: "<%= h render(:partial => '/foo/baz') -%>"
}
Eu quero renderizar /app/views/foo/_baz.html.erb
, mas só renderá /app/views/foo/_baz.json.erb
. Passar :format => 'html'
não ajuda.
ruby-on-rails
format
render
partial
actionview
James A. Rosen
fonte
fonte
Respostas:
Começando com Rails 3.2.3, ao chamar render: partial (só funciona fora do
respond_to
bloco).ao invés de
fonte
:format
opção trabalhos. Obrigado!:content_type
opção em alguns casos - por exemplo, renderizar um modelo HTML de dentro de umformat.pdf
bloco só pode ser feito comrender "template", formats: [:html], content_type: "text/html"
. Preciso disso porque permito o download direto de amostras dos meus livros apenas para membros da minha lista de e-mail - visitantes regulares recebem um formulário de inscrição.O que há de errado com
? Eu apenas tentei isso para renderizar um HTML ERB parcial de dentro de um modelo de construtor Atom e funcionou bem. Não é necessário brincar com variáveis globais (sim, eu sei que eles têm "@" na frente deles, mas é o que são).
Sua
with_format &block
abordagem é legal, porém, e tem a vantagem de especificar apenas o formato, enquanto a abordagem simples especifica o mecanismo de modelo (ERB / builder / etc) também.fonte
baz.en.html.erb
,baz.fr.html.erb
) e desejarrender :partial
uma lógica para escolher a correta (com 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]
vez defoo.baz.[your_string]
. A resposta de zgchurc é uma solução melhor.Para Rails 3, o bloco with_format funciona, mas é um pouco diferente:
fonte
O Rails 4 permitirá que você passe um parâmetro de formatos. Então você pode fazer
Note que você pode fazer algo semelhante no Rails 3, mas não passaria esse formato para nenhuma subparcial (se o formulário chamar outras parciais).
Você pode ter a capacidade do Rails 4 no Rails 3 criando config / initializers / renderer.rb:
Consulte http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific-format/
fonte
Com base na resposta de Roninek , descobri que a melhor solução é a seguinte:
em /app/helpers/application.rb:
Em /app/views/foo/bar.json:
Uma solução alternativa seria redefinir
render
para aceitar um:format
parâmetro.Eu não conseguia
render :file
trabalhar com os moradores locais e sem alguns problemas de caminho.fonte
No Rails 3, a View possui um array de formatos, o que significa que você pode configurá-la para procurar [: mobile,: html]. A configuração padrão é procurar: modelos móveis, mas voltar para: modelos html. Os efeitos dessa configuração irão se espalhar para os parciais internos.
A melhor, mas ainda assim falha, que encontrei para definir isso foi colocar essa linha no topo de cada modelo completo para celular (mas não parciais).
A falha é que você precisa adicionar essa linha a vários modelos. Se alguém souber uma maneira de definir isso uma vez, em application_controller.rb, adoraria saber. Infelizmente, não adianta adicionar essa linha ao layout móvel, porque os modelos são renderizados antes do layout.
fonte
Apenas elaborando o que zgchurch escreveu:
Achei que poderia ser útil.
fonte
Você tem duas opções:
1) usar
render :file
2) alterar o formato do modelo para html definindo a variável @template_format
fonte
Eu tinha um arquivo chamado 'api / item.rabl' e queria renderizá-lo a partir de uma visualização HTML, então tive que usar:
render file: 'api/item', formats: [:json]
(
file
porque o arquivo não tem sublinhado no nome,formats
e nãoformat
(e passa e matriz))fonte
Parece que passar uma
formats
opção irá renderizá-la corretamente na versão mais recente do Rails, pelo menos 3.2:fonte
Eu me deparei com esse tópico quando estava tentando renderizar um XML parcial em outro arquivo de exibição xml.builder. Seguir é uma boa maneira de fazer isso
E sim ... O nome completo do arquivo também funciona aqui ...
fonte