2010-11-29 14 views
43

J'ai un contrôleur appelé ProjectsController. Ses actions, par défaut, recherchent des vues à l'intérieur de app/views/projects. Je voudrais changer ce chemin pour toutes les méthodes (index, show, new, edit etc ...) dans le contrôleur.Comment changer le chemin par défaut des fichiers de vue dans un contrôleur Rails 3?

Par exemple:

class ProjectsController < ApplicationController 

    #I'd like to be able to do something like this 
    views_path 'views/mycustomfolder' 

    def index 
    #some code 
    end 

    def show 
    #some code 
    end 

    def new 
    #some code 
    end 

    def edit 
    #some code 
    end 
end 

S'il vous plaît noter que je ne suis pas en train de changer chaque méthode avec render mais définissant un chemin par défaut pour tous. Est-ce possible? Si c'est le cas, comment?

Merci!

Répondre

19

S'il n'y a pas de méthode intégrée pour cela, vous pouvez peut-être remplacer render pour ce contrôleur?

class MyController < ApplicationController 
    # actions .. 

    private 

    def render(*args) 
    options = args.extract_options! 
    options[:template] = "/mycustomfolder/#{params[:action]}" 
    super(*(args << options)) 
    end 
end 

Vous ne savez pas si cela fonctionne correctement ou si cela fonctionne.

+1

cela fonctionne parfaitement en fait, à l'exception que la 'action' variable n'existe pas. Cependant, ce n'était pas pertinent pour les besoins (j'ai juste besoin de préfixer un dossier sur le chemin). Merci beaucoup! –

+1

prepend_view_path est une solution beaucoup plus propre. –

+2

prepend_view_path dos ne fonctionne pas pour moi: S –

11

Vous pouvez ajouter quelque chose comme:

paths.app.views << "app/views/myspecialdir" 

dans le fichier config/application.rb d'avoir des rails regarder dans un autre répertoire pour les modèles de vue. Le seul inconvénient est qu'il va toujours chercher des fichiers de vue qui correspondent au contrôleur. Donc, si vous avez un contrôleur nommé HomeController avec la configuration ci-dessus pour les vues, il cherchera quelque chose nommé "app/views/myspecialdir/home/index.html.erb" à rendre.

+1

cela semble intuitif, mais il en résulte effectivement l'erreur suivante: 'variable locale non définie ou méthode 'chemins' pour ApplicationController: Class '- des idées? –

+0

Quelle version de rails utilisez-vous? J'ai essayé ceci dans les rails 3.0.x en ajoutant cette ligne dans le bloc Application

+1

Pour l'enregistrement, je suppose que 'path.app.views.unshift (" views/myspecialdir ")' fonctionnerait. C'est à dire. ajoutez votre propre entrée spéciale au début du tableau au lieu de l'ajouter à la fin. Rails recherche probablement les correspondances depuis le début du tableau. –

45

Voir ActionView::ViewPaths::ClassMethods#prepend_view_path.

class ProjectsController < ApplicationController 
    prepend_view_path 'app/views/mycustomfolder' 
    ... 
+12

Cela va chercher des vues dans 'app/views/mycustomfolder/projects /' – Ross

+0

que diriez-vous des contrôleurs de namespaced? si j'ai un fichier api/v3/todos_controller.rb, il va essayer de chercher des templates sur app/view/mycustomfolder/api/v3/todos/show.json.rabl au lieu de app/view/mycustomfolder/todos/show.json .rabl –

+1

Emplacement actuel: http://edgeapi.rubyonrails.org/classes/ActionView/ViewPaths.html#method-i-prepend_view_path (La queue d'édition suggérée est pleine) –

27

Vous pouvez le faire à l'intérieur de votre contrôleur:

def self.controller_path 
    "mycustomfolder" 
    end 
+0

Cela fonctionne très bien, merci –

+1

Splendide, fonctionne parfaitement et est de loin la meilleure solution à ce problème. – dvdplm

+1

Cela fonctionne, mais mes tests de contrôleur RSpec n'utilisent pas le bon contrôleur sauf si je spécifie 'use_route', qui est maintenant obsolète dans Rails 4. –