97 votes

Existe-t-il une fonction Rails pour vérifier si un partiel existe?

Lorsque je rends un partiel qui n'existe pas, j'obtiens une exception. Je voudrais vérifier si un partiel existe avant de le rendre et au cas où il n'existerait pas, je rendrai quelque chose d'autre. J'ai fait le code suivant dans mon fichier .erb, mais je pense qu'il devrait y avoir un meilleur moyen de le faire:

     <% begin %>
      <%= render :partial => "#{dynamic_partial}" %>
    <% rescue ActionView::MissingTemplate %>
      Can't show this data!
    <% end %>
 

97voto

Rein Points 511

Actuellement, j'utilise les éléments suivants dans mes projets Rails 3 / 3.1:

 lookup_context.find_all('posts/_form').any?
 

L'avantage par rapport aux autres solutions que j'ai observées est que cela concernera tous les chemins de vue et pas uniquement les rails racine. C'est important pour moi car j'ai beaucoup de moteurs à rails.

70voto

Jeff Points 11642

J'ai eu du mal avec ce trop. C'est cette méthode que j'ai utilisé:

<%= render :partial => "#{dynamic_partial}" rescue nil %>

En gros, si le partiel n'existe pas, ne rien faire. Ne voulez-vous imprimer quelque chose si l'partielle est manquant, si?

Edit 1: Oh, je n'ai pas à la compréhension de la lecture. Vous avez dit que vous vouliez rendre quelque chose d'autre. Dans ce cas, comment à ce sujet?

<%= render :partial => "#{dynamic_partial}" rescue render :partial => 'partial_that_actually_exists' %>

ou

<%= render :partial => "#{dynamic_partial}" rescue "Can't show this data!" %>

Edit 2:

Alternative: Vérification de l'existence du fichier partiel:

<%= render :partial => "#{dynamic_partial}" if File.exists?(Rails.root.join("app", "views", params[:controller], "_#{dynamic_partial}.html.erb")) %>

52voto

Luke Imhoff Points 425

D’un vue, template_exists intérieure ? fonctionne, mais la convention d’appel ne fonctionne pas avec la chaîne de nom partiel unique, au lieu de cela, il faut template_exists ? (nom, préfixe, partielle)

Pour vérifier la partielle sur le chemin d’accès : app/views/posts/_form.html.slim

Utilisation :

30voto

Flackou Points 814

Dans les Rails 3.2.13, si vous êtes dans un contrôleur, vous pouvez utiliser ceci :

template_exists?("#{dynamic_partial}", _prefixes, true)

template_exists? est déléguée lookupcontext, comme vous pouvez le voir en AbstractController::ViewPaths

_prefixes donne le contexte de la manette de la chaîne d'héritage.

true parce que vous êtes à la recherche pour une partielle (vous pouvez omettre cet argument, si vous voulez un template classique).

http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X