2009-05-12 7 views
4

Pour un plugin Je veux pirater la fonction suivante dans Rails:rendu modèle par défaut lorsque modèle demandé est manquant dans Rails

Lorsqu'un modèle (partiel) n'existe pas (quel que soit le format) Je veux rendre un modèle par défaut. Donc, disons que j'appelle une action 'users/index' si users/index.html.erb n'existe pas (ou un autre format), 'default/index.html.erb' devrait être rendu.

De même, si j'appelle une action « lieux/modifier » et « lieux/edit.html.erb » n'existe pas, par défaut/edit.html.erb »devrait être rendu

Pour partials, Si J'appelle une action 'locations/index' et le modèle 'locations/index.html.erb' appelle le partiel 'locations/_location' qui n'existe pas, il devrait rendre 'default/_object'

La solution est de chercher me donne accès aux variables de templates (par exemple @users, @locations) et aux informations sur le chemin demandé (par exemple users/index, locations/edit). Et cela devrait aussi fonctionner avec les partiels.

J'ai pensé à quelques options que je posterai ci-dessous. Aucun d'eux n'est complètement satisfaisant.

Répondre

0

Solution 1:

Patch singe ActionView :: # Base de rendre


module ActionView 
    class Base 
    def render_with_template_missing(*args, &block) 
     # do something if template does not exist 

     render_without_template_missing(*args, &block) 
    end 
    alias_method_chain :render, :template_missing 
    end 
end 

Ce patch de singe exige de se pencher sur les (changement) internes des rails et des résultats dans le code laid, mais fonctionne probablement.

11

Solution 2:

utilisation rescue_from 'dans ApplicationController

 


class ApplicationController > ActionController::Base 
    rescue_from ActionView::MissingTemplate do |exception| 
    # use exception.path to extract the path information 
    # This does not work for partials 
    end 
end 

 

Inconvénient: ne fonctionne pas pour partials.

+0

neat !, je vais utiliser cela aussi, merci – Oinak

2

J'ai trouvé un patch qui est relativement propre, il corrige uniquement la recherche du template qui est exactement ce qui était requis dans la question.


module ActionView 
    class PathSet 

    def find_template_with_exception_handling(original_template_path, format = nil, html_fallback = true) 
     begin 
     find_template_without_exception_handling(original_template_path, format, html_fallback) 
     rescue ActionView::MissingTemplate => e 
     # Do something with original_template_path, format, html_fallback 
     raise e 
     end 
    end 
    alias_method_chain :find_template, :exception_handling 

    end 
end 
3

Rails 3.1 recherche automatiquement les fichiers dans l'application/template.html.erb après avoir regardé dans le contrôleur/template.html.erb vous pouvez le voir dans l'exception comme ceci:

Missing template [controller name]/index, application/index with {:locale=>[:en, :en], :formats=>[:html], :handlers=>[:erb, :coffee, :builder]}. Searched in: * "/path/to/rails_project/app/views" 

donc, il suffit de mettre vos modèles par défaut dans app/views/application