web-dev-qa-db-de.com

Wie ändert man den Standardpfad der Ansichtsdateien in einem Rails 3-Controller?

Ich habe einen Controller namens ProjectsController. Standardmäßig suchen seine Aktionen nach Ansichten in app/views/projects. Ich möchte diesen Pfad für alle Methoden (index, show, new, edit etc ...) im Controller ändern.

Zum Beispiel:

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

Bitte beachten Sie, dass ich nicht jede Methode mit render ändere, sondern einen Standardpfad für alle Methoden definiere. Ist das möglich? Wenn das so ist, wie?

Vielen Dank!

43
Yuval Karmi

Wenn es dafür keine integrierte Methode gibt, können Sie möglicherweise render für diesen Controller überschreiben?

class MyController < ApplicationController
  # actions ..

  private

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

Nicht sicher, wie gut das in der Praxis funktioniert oder ob es überhaupt funktioniert.

21
August Lilleaas

Siehe ActionView :: ViewPaths :: ClassMethods # prepend_view_path .

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

Sie können dies in Ihrem Controller tun:

  def self.controller_path
    "mycustomfolder"
  end
28
Ravenstine

Sie können etwas hinzufügen:

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

in der Datei config/application.rb, damit Rails in einem anderen Verzeichnis nach Ansichtsvorlagen sucht. Der einzige Nachteil ist, dass nach Ansichtsdateien gesucht wird, die zum Controller passen. Wenn Sie also einen Controller namens HomeController mit der obigen Konfiguration für die Ansichten haben, wird nach etwas gesucht, das als "app/views/myspecialdir/home/index.html.erb" gerendert wird.

11
Mike Gorski

Wenn Sie den Standardpfad für alle Ansichten auf App-Ebene ändern möchten, können Sie Folgendes tun:

class ApplicationController < ActionController::Base
  before_action :set_views

  private

  def set_views
    prepend_view_path "#{Rails.root.join('app', 'views', 'new_views')}"
  end
end

Schreiben Sie alle Ihre Ansichten in den Ordner new_views, und zwar in derselben Verzeichnisstruktur wie das Original.

P.S. - Diese Antwort basiert auf der Antwort von @mmell .

1
Swaps