默认情况下,当我要求rails控制器执行消息/索引时,他确实
def index
respond_to{|fmt| fmt.html}
end
并显示app / views / messages / index.html.erb
有一位客户希望他的平台实例能够以不同方式显示视图(并且只能使用css进行更改)。
我想到的解决方案
创建目录app / views /#{customername},其结构与app / views相同,但只能覆盖默认视图。
设置包含必须覆盖的视图列表的数组常量(如果没有,则应加载默认视图)
CUSTOM_VIEWS["messages"]=["index","show","edit"]
客户特定配置文件中的某处
在所有控制器操作中执行类似
的操作def index
respond_to do |fmt|
fmt.html do
if CUSTOM_VIEWS[params[:controller]].include?(params[:action])
#override default app/views/messages/index.html.erb with app/views/customername/messages/index.html.erb
render "#{customername}/#{params[:controller]}/#{params[:action]}"
end
end
end
end
还是有更好/更快的解决方案/插件吗?
答案 0 :(得分:1)
答案 1 :(得分:1)
我相信“view_paths”和“prepend_view_path”可以回答我的问题
例如
http://www.axehomeyg.com/2009/06/10/view-path-manipulation-for-rails-with-aop/
UPD:
通过简单添加到application_controller
解决def override_views
if APP_CONFIG['pr_name']!=nil
ActionController::Base.view_paths=[RAILS_ROOT+"/app/custom_views/"+APP_CONFIG['pr_name'],RAILS_ROOT+"/app/views/"]
end
end
其中APP_CONFIG ['pr_name']是特定的产品名称。
它的作用基本上是从app / custom_views / customername /加载自定义视图,如果它存在特定的控制器操作,如果没有它从app / views /
加载默认视图