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

时间:2010-11-29 06:08:04

标签: ruby-on-rails ruby model-view-controller ruby-on-rails-3

我有一个名为ProjectsController的控制器。默认情况下,它的操作会查找app/views/projects内的视图。我想在控制器中更改所有方法(indexshownewedit等...)的路径。

例如:

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

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

谢谢!

6 个答案:

答案 0 :(得分:47)

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

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

答案 1 :(得分:28)

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

  def self.controller_path
    "mycustomfolder"
  end

答案 2 :(得分:21)

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

class MyController < ApplicationController
  # actions ..

  private

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

不确定这在实践中有多好,或者它是否有效。

答案 3 :(得分:11)

您可以添加以下内容:

paths.app.views << "app/views/myspecialdir"
在config / application.rb文件中

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

答案 4 :(得分:1)

如果您想在应用级别更改所有观看次数的默认路径,可以执行以下操作 -

class ApplicationController < ActionController::Base
  before_action :set_views

  private

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

将所有视图写在文件夹new_views中,遵循与原始文件相同的目录结构。

  

P.S。 - 这个答案的灵感来自于@mmell的回答。

答案 5 :(得分:0)

接受的答案不再适用于我。在苦苦哀求和咬牙切齿之后,我设法发现如果在动作中没有调用 render,则调用 default_render 方法。就我而言,我需要按如下方式覆盖控制器中的 default_render 消息:

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