Lorsque je rend 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 autre chose. 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 %>
ruby-on-rails
partial
Daniel Cukier
la source
la source
rescue
est risquée. Je regarderais les autres solutions avant de l'utiliser.Réponses:
Actuellement, j'utilise ce qui suit dans mes projets Rails 3 / 3.1:
L'avantage par rapport aux autres solutions que j'ai vues est que cela va regarder dans tous les chemins de vue au lieu de simplement votre racine de rails. C'est important pour moi car j'ai beaucoup de moteurs sur rails.
Cela fonctionne également dans Rails 4.
la source
lookup_context.exists?("find", lookup_context.prefixes, true)
. De cette façon, vous n'avez pas besoin de coder en dur le répertoire de vue dans l'appel. Remarque, ceci est pour les partiels. Pour les non partiels, omettez le dernier argument (ou utilisez false au lieu de true)J'avais du mal avec ça aussi. C'est la méthode que j'ai fini par utiliser:
En gros, si le partiel n'existe pas, ne faites rien. Vouliez-vous imprimer quelque chose si le partiel est manquant?
Edit 1: Oh, j'échoue à la compréhension de la lecture. Vous avez dit que vous vouliez rendre autre chose. Dans ce cas, qu'en est-il de cela?
ou
Modifier 2:
Alternative: vérification de l'existence du fichier partiel:
la source
rescue nil
et... rescue ...
le masqueront. Cela conduit à des bogues difficiles à déboguer.De l'intérieur d'une vue, template_exists? fonctionne, mais la convention d'appel ne fonctionne pas avec la chaîne de nom partielle unique, à la place, elle prend template_exists? (nom, préfixe, partiel)
Pour vérifier le chemin d'accès partiel: app / views / posts / _form.html.slim
Utilisation:
la source
Dans Rails 3.2.13, si vous êtes dans un contrôleur, vous pouvez utiliser ceci:
template_exists?
est délégué àlookupcontext
, comme vous pouvez le voir dansAbstractController::ViewPaths
_prefixes
donne le contexte de la chaîne d'héritage du contrôleur.true
parce que vous recherchez un partiel (vous pouvez omettre cet argument si vous voulez un modèle régulier).http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F
la source
lookup_context.template_exists?("navbar", controller._prefixes, :partial)
. Cela me dit si le modèle actuel rendant cette mise en page a la "barre de navigation" partielle indiquée, et si c'est le cas, je peux le rendre. Je passe:partial
juste pour être explicite sur ce qu'est ce booléen -:partial
est la vérité. Merci pour le_prefixes
peu, @Flackou!_prefixes
parnil
si vous appelez un partiel qui se trouve dans un répertoire parent différent.Je sais que cela a été répondu et qu'il a un million d'années, mais voici comment j'ai fini par résoudre cela pour moi ...
Rails 4.2
Tout d'abord, je mets ceci dans mon application_helper.rb
et maintenant au lieu d'appeler
<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>
je viens d'appeler
<%= render_if_exists "#{dynamic_path}" %>
J'espère que cela pourra aider. (je n'ai pas essayé dans rails3)
la source
def render_if_exists(*args); render(*args) if ...
pour celaJ'ai utilisé ce paradigme à plusieurs reprises avec beaucoup de succès:
L'avantage du code ci-dessus est que nous pouvons gérer des cas spécifiques de remorquage:
Si nous n'utilisons que le code
<%= render :partial => "#{dynamic_partial}" rescue nil %>
ou un dérivé, le partiel peut exister mais déclencher une exception qui sera silencieusement mangée et deviendra une source de douleur à déboguer.la source
Qu'en est-il de votre propre assistant:
la source