[英]How to change the default path of view files in a Rails 3 controller?
我有一個名為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
請注意,我沒有使用render
更改每個方法,而是為所有方法定義默認路徑。 這可能嗎? 如果是這樣,如何?
謝謝!
請參閱ActionView::ViewPaths::ClassMethods#prepend_view_path 。
class ProjectsController < ApplicationController
prepend_view_path 'app/views/mycustomfolder'
...
您可以在控制器中執行此操作:
def self.controller_path
"mycustomfolder"
end
如果沒有為此的內置方法,也許您可以覆蓋該控制器的render
?
class MyController < ApplicationController
# actions ..
private
def render(*args)
options = args.extract_options!
options[:template] = "/mycustomfolder/#{params[:action]}"
super(*(args << options))
end
end
不確定這在實踐中的效果如何,或者它是否有效。
您可以添加如下內容:
paths.app.views << "app/views/myspecialdir"
在 config/application.rb 文件中,讓 rails 在另一個目錄中查找視圖模板。 一個警告是它仍然會尋找與控制器匹配的視圖文件。 因此,如果您有一個名為 HomeController 且具有上述視圖配置的控制器,它將尋找名為“app/views/myspecialdir/home/index.html.erb”的內容來呈現。
如果您想在應用程序級別更改所有視圖的默認路徑,您可以執行以下操作 -
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
。
PS - 這個答案的靈感來自@mmell的答案。
接受的答案不再適用於我。 在苦苦哀求和咬牙切齒之后,我設法發現如果在動作中沒有調用render
,則調用default_render
方法。 就我而言,我需要按如下方式覆蓋控制器中的default_render
消息:
def default_render
render "path/to/views/#{action_name.to_s}"
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.