2014-02-11 17 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有一些体面的文档,肯定会很好!