rails - 如何覆盖默认视图

时间:2009-12-01 17:08:43

标签: ruby-on-rails views

默认情况下,当我要求rails控制器执行消息/索引时,他确实

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

并显示app / views / messages / index.html.erb

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

我想到的解决方案

  1. 创建目录app / views /#{customername},其结构与app / views相同,但只能覆盖默认视图。

  2. 设置包含必须覆盖的视图列表的数组常量(如果没有,则应加载默认视图)

    CUSTOM_VIEWS["messages"]=["index","show","edit"] 
    

    客户特定配置文件中的某处

  3. 在所有控制器操作中执行类似

    的操作
    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
    
  4. 还是有更好/更快的解决方案/插件吗?

2 个答案:

答案 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 /

加载默认视图