开发者

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

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 meth开发者_如何学Pythonod with render but defining a default path for all of them. Is this possible? If so, how?

Thank you!


See ActionView::ViewPaths::ClassMethods#prepend_view_path.

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


You can do this inside your controller:

  def self.controller_path
    "mycustomfolder"
  end


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.


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.


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.


The accepted answer no longer works for me. After much wailing and gnashing of teeth, I've managed to find that if render is not called in the action, then the default_render method is called. In my case, I needed to override the default_render message in my controller as follows:

def default_render
  render "path/to/views/#{action_name.to_s}"
end
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜