如何在Rails 3控制器中更改视图文件的默认路径?

Yuv*_*rmi 44 ruby model-view-controller ruby-on-rails ruby-on-rails-3

我有一个控制器叫ProjectsController.默认情况下,它的操作会查找内部视图app/views/projects.我想改变这种路径的所有方法(index,show,new,edit等...)在控制器中.

例如:

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
Run Code Online (Sandbox Code Playgroud)

请注意我并没有更改每个方法,render而是为所有方法定义默认路径.这可能吗?如果是这样,怎么样?

谢谢!

mme*_*ell 47

请参阅ActionView :: ViewPaths :: ClassMethods #prepend_view_path.

class ProjectsController < ApplicationController
    prepend_view_path 'app/views/mycustomfolder'
    ...
Run Code Online (Sandbox Code Playgroud)

  • 这将在'app/views/mycustomfolder/projects /'中查找视图 (12认同)

Rav*_*ine 30

您可以在控制器内执行此操作:

  def self.controller_path
    "mycustomfolder"
  end
Run Code Online (Sandbox Code Playgroud)


Aug*_*aas 22

如果没有内置方法,也许您可​​以覆盖render该控制器?

class MyController < ApplicationController
  # actions ..

  private

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

不确定这在实践中是如何运作的,或者它是否有效.


Mik*_*ski 11

您可以添加以下内容:

paths.app.views << "app/views/myspecialdir"
Run Code Online (Sandbox Code Playgroud)

在config/application.rb文件中,让rails在另一个目录中查看视图模板.需要注意的是,它仍然会查找与控制器匹配的视图文件.因此,如果您有一个名为HomeController的控制器,其中包含上述视图配置,那么它将查找名为"app/views/myspecialdir/home/index.html.erb"的内容进行渲染.