ruby on rails - validaciones - ¿Hay alguna función de Rails para verificar si existe un parcial?
formularios en ruby on rails (7)
¿Desde dentro 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? (name, prefix, partial)
Para comprobar parcial en la ruta: app / views / posts / _form.html.slim
Utilizar:
lookup_context.template_exists?("form", "posts", true)
Cuando presento un parcial que no existe, recibo una excepción. Me gustaría comprobar si existe un parcial antes de representarlo y, en caso de que no exista, mostraré algo más. Hice el siguiente código en mi archivo .erb, pero creo que debería haber una mejor manera de hacerlo:
<% begin %>
<%= render :partial => "#{dynamic_partial}" %>
<% rescue ActionView::MissingTemplate %>
Can''t show this data!
<% end %>
¿Qué hay de tu propio ayudante?
def render_if_exists(path, *args)
render path, *args
rescue ActionView::MissingTemplate
nil
end
Actualmente, estoy usando lo siguiente en mis proyectos de Rails 3 / 3.1:
lookup_context.find_all(''posts/_form'').any?
La ventaja con respecto a otras soluciones que he visto es que esto se verá en todas las rutas de vista en lugar de en la raíz de sus raíles. Esto es importante para mí ya que tengo muchos motores de rieles.
Esto también funciona en Rails 4.
En Rails 3.2.13, si estás en un controlador, puedes usar esto:
template_exists?("#{dynamic_partial}", _prefixes, true)
template_exists?
se delega en lookupcontext
, como se puede ver en AbstractController::ViewPaths
_prefixes
proporciona el contexto de la cadena de herencia del controlador.
true
porque estás buscando un parcial (puedes omitir este argumento si quieres una plantilla regular).
He utilizado este paradigma en muchas ocasiones con gran éxito:
<%=
begin
render partial: "#{dynamic_partial}"
rescue ActionView::MissingTemplate
# handle the specific case of the partial being missing
rescue
# handle any other exception raised while rendering the partial
end
%>
El beneficio del código anterior es que podemos manejar casos específicos de remolque:
- El parcial realmente falta
- El parcial existe, pero arrojó un error por alguna razón
Si solo usamos el código <%= render :partial => "#{dynamic_partial}" rescue nil %>
o alguna derivada, el parcial puede existir pero genera una excepción que se consumirá en silencio y se convertirá en una fuente de dolor para la depuración.
Sé que esto ha sido respondido y tiene un millón de años, pero así es como terminé arreglando esto para mí ...
Rails 4.2
Primero, puse esto en mi application_helper.rb
def render_if_exists(path_to_partial)
render path_to_partial if lookup_context.find_all(path_to_partial,[],true).any?
end
y ahora en lugar de llamar
<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>
Acabo de llamar a <%= render_if_exists "#{dynamic_path}" %>
Espero que ayude. (no lo he probado en rails3)
Yo estaba luchando con esto también. Este es el método que terminé usando:
<%= render :partial => "#{dynamic_partial}" rescue nil %>
Básicamente, si el parcial no existe, no hagas nada. ¿Querías imprimir algo si el parcial faltaba?
Edit 1: Oh, fallo en la comprensión de lectura. Usted dijo que quería representar algo más. En ese caso, ¿qué tal esto?
<%= render :partial => "#{dynamic_partial}" rescue render :partial => ''partial_that_actually_exists'' %>
o
<%= render :partial => "#{dynamic_partial}" rescue "Can''t show this data!" %>
Editar 2:
Alternativa: Comprobación de la existencia del archivo parcial:
<%= render :partial => "#{dynamic_partial}" if File.exists?(Rails.root.join("app", "views", params[:controller], "_#{dynamic_partial}.html.erb")) %>