2011-06-15 33 views
2

做一些集成工作與另一個網站我有需要在運行時創建佈局的不尋常的要求。渲染布局存儲在數據庫中

在我不得不求助於像這樣的時刻:

def new 
    body = render_to_string 'new', :layout => false  
    page = add_layout(body, db.load_template) 
    render :text => page 
end 

這是一個有點尷尬,我寧願做這樣的事情:

def new 
    ... 
    render 'new', :layout => db.load_template 
end 

是否有一個更清潔如何做到這一點?也許可以在運行時註冊新的佈局,並使用正常的語法?

回答

3

哈!我遇到了一個解決這個問題的項目。退房panoramic。它將數據庫視圖存儲在數據庫中,而不是文件系統。

+2

謝謝,該項目沒有做我想要的東西,但我看了一下源代碼,看看它們是如何做的。他們註冊了ActionView :: Resolver的一個子類,它允許您以任何您想要的方式提供模板。 – opsb 2011-06-15 12:59:17

1

您可以使用模塊和alias_method_chain擴展ActionController :: Base(或ApplicationController)以使其工作。

module Foo 

    alias_method_chain :render, :dblayout 

    def render_with_dblayout options = nil, extra_options = {}, &block 
    if options.include? :dblayout 
    ... 
    else 
    render_without_dblayout options, extra_options { yield } 
    end 
    end 
end 

ActionController::Base.send(:include, Foo)