How to change the default path of view files in a

2019-01-08 16:51发布

问题:

I have a controller called ProjectsController. Its actions, by default, look for views inside app/views/projects. I'd like to change that path for all methods (index, show, new, edit etc...) in the controller.

For example:

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

Please note I am not changing each method with render but defining a default path for all of them. Is this possible? If so, how?

Thank you!

回答1:

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.



回答2:

See ActionView::ViewPaths::ClassMethods#prepend_view_path.

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


回答3:

You can do this inside your controller:

  def self.controller_path
    "mycustomfolder"
  end


回答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.



回答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.