2009-12-01 140 views
0

默认情况下,当我问轨控制器做消息/指数,他确实轨道 - 如何覆盖默认视图

def index 
respond_to{|fmt| fmt.html} 
end 

和显示应用/视图/消息/ index.html.erb

有一个客户希望他的平台实例以不同方式显示意见(并且只能使用css进行更改)。

解决方案,我认为将是

  1. 创建目录应用程序/视图/#{客户名称},这将具有相同结构的应用程序/意见,但只会有哪些必须覆盖默认的视图。

  2. 在客户特定的配置文件

  3. 设置含有的其必须被重写(如果不是,就应该加载默认视图)视图列表数组常量

    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 
    

还是有更好/更快的解决方案/插件来做到这一点?

回答

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']是特定产品名称。

基本上它加载自定义视图从应用程序/ custom_views /客户名称/如果它存在于特定的控制器动作,如果不是它加载从应用程序/视图/

+0

这不幸的是跨请求坚持默认视图。 – aceofspades 2011-11-08 23:30:48