2014-02-11 23 views
0

我已經創建了一個自定義ActionView::Resolver從數據庫,而不是文件系統拉視圖。它工作 - 幾乎。它正確地拉和呈現視圖,但它不會將其呈現在佈局中!基本上,結果是隻有視圖部分的頁面(沒有佈局,樣式等)。下面是我在做什麼:自定義ActionView ::解析器忽略佈局

DbResolver

class DbResolver < ActionView::Resolver 
    require "singleton" 
    include Singleton 

    @@view_handler = ActionView::Template.registered_template_handler(:erb) 

    def find_templates(name, prefix, partial, details) 
    if (!prefix.empty?) 
     pages = Page.where("`controller_name` = :controller_name AND `action_name` = :action_name", { :controller_name => prefix, :action_name => name }) 

     templates = pages.collect { |page| 
     ActionView::Template.new(page.content, "#{page.class} - #{page.id} - #{page.controller_name}/#{page.action_name}", @@view_handler, { 
      :format   => "text/html", 
      :updated_at  => page.updated_at, 
      :virtual_path => "#{page.controller_name}/#{page.action_name}" 
     }) 
     } 

     return templates 
    end 
    end 
end 

BaseController

class BaseController < ApplicationController 
    layout "public" 
end 

的ContactController

class ContactController < BaseController 
    prepend_view_path Page.resolver 

    def index 
    end 
end 

require "lib/db_resolver" 

class Page < ActiveRecord::Base 
    def self.resolver 
    return DbResolver.instance 
    end 
end 

爲什麼我layout "public"被忽略?我如何讓這件事停止忽略我的佈局?

更新從日誌中,我看到的Rails確實試圖找到layouts/public佈局 - 但它不是在數據庫中,我的解析器返回[]。我的理解是Rails會檢查文件系統(默認行爲)。但相反,它似乎假裝一切都很好,並繼續:

Finding template with: path=about/index; partial=false; details={"formats":["html"],"handlers":["builder","coffee","erb"],"locale":["en"]} 
Locating view about/index in database. 

Finding template with: path=layouts/about; partial=false; details={"formats":["text/html"],"handlers":["builder","coffee","erb"],"locale":["en"]} 
Locating view layouts/about on file system. 

Finding template with: path=layouts/public; partial=false; details={"formats":["text/html"],"handlers":["builder","coffee","erb"],"locale":["en"]} 
Locating view layouts/public on file system. 

Finding template with: path=layouts/public; partial=false; details={"formats":["html","text","js","css","ics","csv","png","jpeg","gif","bmp","tiff","mpeg","xml","rss","atom","yaml","multipart_form","url_encoded_form","json","pdf","zip"],"handlers":["builder","coffee","erb"],"locale":["en"]} 
Locating view layouts/public on file system. 

Started GET "/about" for 127.0.0.1 at Tue Feb 11 22:05:38 -0500 2014 
Processing by AboutController#index as HTML 
    [1m[36mPage Load (1.0ms)[0m [1mSELECT `pages`.* FROM `pages` WHERE (`controller_name` = 'about' AND `action_name` = 'index')[0m 
    Rendered Page - 1 - about/index (0.0ms) 
Completed 200 OK in 21ms (Views: 19.0ms | ActiveRecord: 1.0ms) 

回答

2

解決了它!我真的不知道這是甚麼問題的原因,但這個解決方案是有效的。我有:format參數集text/html,而不是僅僅html

ActionView::Template.new(page.content, "#{page.class} - #{page.id} - #{page.controller_name}/#{page.action_name}", @@view_handler, { 
    :format   => "html", 
    :updated_at  => page.updated_at, 
    :virtual_path => "#{page.controller_name}/#{page.action_name}" 
}) 

我改變了:format => 'text/html'線簡單地:format => 'html'。下面是最終DbResolver:

class DbResolver < ActionView::Resolver 
    @@view_handler = ActionView::Template.registered_template_handler(:erb) 

    def initialize(params) 
    @exclude_prefixes = (params[:exclude_prefixes] || []) 
    super() 
    end 

    def find_templates(name, prefix, partial, details) 
    if (!prefix.empty? && [email protected]_prefixes.include?(prefix)) 
     pages = Page.where("`controller_name` = :controller_name AND `action_name` = :action_name", { :controller_name => prefix, :action_name => name }) 

     return pages.collect { |page| 
     ActionView::Template.new(page.content, "#{page.class} - #{page.id} - #{page.controller_name}/#{page.action_name}", @@view_handler, { 
      :format   => (details[:format] || "html"), 
      :updated_at  => page.updated_at, 
      :virtual_path => "#{page.controller_name}/#{page.action_name}" 
     }) 
     } 
    end 

    return [] 
    end 
end 

也許有人可以解釋爲什麼:format設置「卡住」當我創造了第一個模板(約/指數),即相同的格式,然後回傳給解析器時,它是試圖找到佈局。我認爲這是因爲默認情況下預計佈局的格式與視圖相同。我想這是有道理的。

如果Rails有一些體面的文檔,肯定會很好!