我有一个名为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
更改每个方法,而是为所有方法定义默认路径。这可能吗?如果是这样,怎么样?
谢谢!
答案 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