Quando eu renderizo um parcial que não existe, recebo uma exceção. Gostaria de verificar se existe um parcial antes de renderizá-lo e, caso não exista, vou renderizar outra coisa. Fiz o seguinte código em meu arquivo .erb, mas acho que deve haver uma maneira melhor de fazer isso:
<% begin %>
<%= render :partial => "#{dynamic_partial}" %>
<% rescue ActionView::MissingTemplate %>
Can't show this data!
<% end %>
ruby-on-rails
partial
Daniel Cukier
fonte
fonte
rescue
é arriscada. Eu examinaria as outras soluções antes de usá-lo.Respostas:
Atualmente, estou usando o seguinte em meus projetos Rails 3 / 3.1:
A vantagem sobre outras soluções que eu vi é que isso vai olhar em todos os caminhos de exibição em vez de apenas na raiz do rails. Isso é importante para mim, pois tenho muitos motores Rails.
Isso também funciona no Rails 4.
fonte
lookup_context.exists?("find", lookup_context.prefixes, true)
. Dessa forma, você não precisa codificar o diretório de visualização na chamada. Observe, isso é para parciais. Para não parciais, omita o último argumento (ou use falso em vez de verdadeiro)Eu estava lutando com isso também. Este é o método que acabei usando:
Basicamente, se o parcial não existe, não faça nada. Você quer imprimir algo se o parcial estiver faltando?
Edição 1: Oh, eu falho em compreensão de leitura. Você disse que queria renderizar outra coisa. Nesse caso, que tal isso?
ou
Editar 2:
Alternativa: Verificar a existência do arquivo parcial:
fonte
rescue nil
e... rescue ...
irão ocultá-lo. Isso leva a bugs que são difíceis de depurar.De dentro de uma visão, template_exists? funciona, mas a convenção de chamada não funciona com a string de nome parcial única, em vez disso, leva template_exists? (nome, prefixo, parcial)
Para verificar se há parcial no caminho: app / views / posts / _form.html.slim
Usar:
fonte
No Rails 3.2.13, se você estiver em um controlador, você pode usar isto:
template_exists?
é delegadolookupcontext
, como você pode ver emAbstractController::ViewPaths
_prefixes
fornece o contexto da cadeia de herança do controlador.true
porque você está procurando por um parcial (você pode omitir este argumento se quiser um modelo regular).http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F
fonte
lookup_context.template_exists?("navbar", controller._prefixes, :partial)
. Isso me diz se o modelo atual que renderiza este layout tem o parcial "navbar" declarado e, se tiver, posso renderizá-lo. Eu passo:partial
apenas para ser explícito sobre o que esse booleano é -:partial
é verdade. Obrigado pela_prefixes
ajuda, @Flackou!_prefixes
pornil
se você estiver chamando um parcial que está em um diretório pai diferente.Sei que isso foi respondido e tem um milhão de anos, mas foi assim que acabei consertando isso para mim ...
Rails 4.2
Primeiro, coloco isso em meu application_helper.rb
e agora em vez de ligar
<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>
eu acabei de ligar
<%= render_if_exists "#{dynamic_path}" %>
espero que ajude. (não tentei no rails3)
fonte
def render_if_exists(*args); render(*args) if ...
para issoUsei esse paradigma em muitas ocasiões com grande sucesso:
A vantagem do código acima é que podemos lidar com dois casos específicos:
Se usarmos apenas o código
<%= render :partial => "#{dynamic_partial}" rescue nil %>
ou algum derivado, o parcial pode existir, mas levanta uma exceção que será silenciosamente comida e se tornará uma fonte de problemas para depurar.fonte
E quanto ao seu próprio ajudante:
fonte