Cuando renderizo un parcial que no existe, obtengo una excepción. Me gustaría comprobar si existe un parcial antes de renderizarlo y, en caso de que no exista, renderizaré algo más. Hice el siguiente código en mi archivo .erb, pero creo que debería haber una mejor manera de hacer esto:
<% begin %>
<%= render :partial => "#{dynamic_partial}" %>
<% rescue ActionView::MissingTemplate %>
Can't show this data!
<% end %>
ruby-on-rails
partial
Daniel Cukier
fuente
fuente
rescue
es arriesgada. Vería las otras soluciones antes de usarlo.Respuestas:
Actualmente, estoy usando lo siguiente en mis proyectos Rails 3 / 3.1:
La ventaja sobre otras soluciones que he visto es que esto se verá en todas las rutas de vista en lugar de solo en la raíz de los rieles. Esto es importante para mí porque tengo muchos motores de raíles.
Esto también funciona en Rails 4.
fuente
lookup_context.exists?("find", lookup_context.prefixes, true)
. De esta manera, no necesita codificar el directorio de vista en la llamada. Tenga en cuenta que esto es para parciales. Para no parciales, omita el último argumento (o use falso en lugar de verdadero)Yo también estaba luchando con esto. Este es el método que terminé usando:
Básicamente, si el parcial no existe, no hagas nada. Sin embargo, ¿quería imprimir algo si faltaba el parcial?
Edición 1: Oh, fallo en la comprensión de lectura. Dijiste que querías renderizar algo más. En ese caso, ¿qué tal esto?
o
Edición 2:
Alternativa: Comprobación de la existencia del archivo parcial:
fuente
rescue nil
y... rescue ...
los métodos de ocultar. Eso conduce a errores que son difíciles de depurar.Desde el interior de una vista, template_exists? funciona, pero la convención de llamada no funciona con la única cadena de nombre parcial, sino que toma template_exists? (nombre, prefijo, parcial)
Para verificar si hay parcial en la ruta: app / views / posts / _form.html.slim
Utilizar:
fuente
En Rails 3.2.13, si está en un controlador, puede usar esto:
template_exists?
se delega alookupcontext
, como puede ver enAbstractController::ViewPaths
_prefixes
da el contexto de la cadena de herencia del controlador.true
porque está buscando un parcial (puede omitir este argumento si desea una plantilla normal).http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F
fuente
lookup_context.template_exists?("navbar", controller._prefixes, :partial)
. Esto me dice si la plantilla actual que representa este diseño tiene la "barra de navegación" parcial, y si es así puedo renderizarla. Paso:partial
solo para ser explícito sobre qué es ese booleano::partial
es verdad. ¡Gracias por el_prefixes
poco, @Flackou!_prefixes
connil
si está llamando a un parcial que se encuentra en un directorio principal diferente.Sé que esto ha sido respondido y tiene un millón de años, pero así es como terminé arreglándome esto ...
Carriles 4.2
Primero, puse esto en mi application_helper.rb
y ahora en lugar de llamar
<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>
Acabo de llamar
<%= render_if_exists "#{dynamic_path}" %>
Espero que ayude. (no lo he probado en rails3)
fuente
def render_if_exists(*args); render(*args) if ...
para queHe utilizado este paradigma en muchas ocasiones con gran éxito:
El beneficio del código anterior es que podemos manejar casos específicos de remolque:
Si solo usamos el código
<%= render :partial => "#{dynamic_partial}" rescue nil %>
o algún derivado, el parcial puede existir pero generar una excepción que será devorada silenciosamente y se convertirá en una fuente de dolor para depurar.fuente
¿Y tu propio ayudante?
fuente