Come modificare il percorso predefinito dei file di visualizzazione in un controller Rails 3?

Ho un controller chiamato ProjectsController . Le sue azioni, per impostazione predefinita, cercano viste all’interno di app/views/projects . Mi piacerebbe cambiare quel percorso per tutti i metodi ( index , show , new , edit etc …) nel controller.

Per esempio:

 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 

Si prega di notare che non sto cambiando ogni metodo con il render ma definendo un percorso predefinito per tutti loro. È ansible? Se é cosi, come?

Grazie!

Se non esiste un metodo integrato per questo, forse puoi sovrascrivere il render per quel controller?

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

Non sei sicuro di come funzioni in pratica o se funzioni del tutto.

Vedi ActionView :: ViewPaths :: ClassMethods # prepend_view_path .

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

Puoi farlo all’interno del tuo controller:

  def self.controller_path "mycustomfolder" end 

Puoi aggiungere qualcosa come:

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

nel file config / application.rb in modo che i rails abbiano un aspetto in un'altra directory per i modelli di visualizzazione. L'unica avvertenza è che continuerà a cercare i file di visualizzazione che corrispondono al controller. Quindi, se hai un controller chiamato HomeController con la configurazione precedente per le viste, cercherà qualcosa chiamato "app / views / myspecialdir / home / index.html.erb" per il rendering.

Se desideri modificare il percorso predefinito per tutte le visualizzazioni a livello di app, puoi fare qualcosa come seguire –

 class ApplicationController < ActionController::Base before_action :set_views private def set_views prepend_view_path "#{Rails.root.join('app', 'views', 'new_views')}" end end 

E scrivi tutte le tue viste nella cartella new_views seguendo la stessa struttura di directory dell'originale.

PS - Questa risposta è ispirata alla risposta di @mmell .