How to change the default path of view files in a Rails 3 controller?

Solution 1:

See ActionView::ViewPaths::ClassMethods#prepend_view_path.

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

Solution 2:

You can do this inside your controller:

  def self.controller_path
    "mycustomfolder"
  end

Solution 3:

If there's no built-in method for this, perhaps you can override render for that controller?

class MyController < ApplicationController
  # actions ..

  private

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

Not sure how well this works out in practice, or if it works at all.

Solution 4:

You can add something like:

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

in the config/application.rb file to have rails look in another directory for view templates. The one caveat is that it'll still look for view files that match the controller. So if you have a controller named HomeController with the above config for the views it'll look for something named "app/views/myspecialdir/home/index.html.erb" to render.

Solution 5:

If you want to change the default path for all your views at app level, you could do something like following -

class ApplicationController < ActionController::Base
  before_action :set_views

  private

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

And write all your views in the folder new_views following the same directory structure as original.

P.S. - This answer is inspired from @mmell's answer.