Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 method with render but defining a default path for all of them. Is this possible? If so, how?

Thank you!

like image 345
Yuval Karmi Avatar asked Nov 29 '10 06:11

Yuval Karmi


People also ask

How do Rails routes work?

Rails routing is a two-way piece of machinery – rather as if you could turn trees into paper, and then turn paper back into trees. Specifically, it both connects incoming HTTP requests to the code in your application's controllers, and helps you generate URLs without having to hard-code them as strings.


3 Answers

See ActionView::ViewPaths::ClassMethods#prepend_view_path.

class ProjectsController < ApplicationController
    prepend_view_path 'app/views/mycustomfolder'
    ...
like image 117
mmell Avatar answered Nov 01 '22 11:11

mmell


You can do this inside your controller:

  def self.controller_path
    "mycustomfolder"
  end
like image 39
Ravenstine Avatar answered Nov 01 '22 11:11

Ravenstine


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.

like image 23
August Lilleaas Avatar answered Nov 01 '22 09:11

August Lilleaas