2014-02-11 4 views
0

ActionView::Resolver 사용자 지정 파일 시스템 대신 데이터베이스에서 뷰를 가져 왔습니다. 그것은 잘 작동합니다. 뷰를 올바르게 당기고 렌더링하지만 레이아웃 안에 렌더링하지 않습니다! 기본적으로 결과는보기 부분 만있는 페이지입니다 (레이아웃, 스타일링 등 없음). 여기에 내가 뭘하는지입니다 :사용자 지정 ActionView :: Resolver가 레이아웃을 무시합니다.

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"은 무시되고있다? 이 일을 내 레이아웃 무시 무시하게하려면 어떻게해야합니까? 로그에서

업데이트, 나는 레일 참으로 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

해결했습니다! 나는 이것이 심지어 어떻게 문제의 원인인지는 모르지만,이 수정이 효과가있다. 내가 대신 htmltext/html:format 매개 변수 세트를 가지고 :

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 => 'html':format => 'text/html' 라인을 변경했습니다. 내가 처음 템플릿을 만들 때 :format (약/인덱스) "붙어"설정 이유

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 

어쩌면 누군가가 설명 할 수있는이 때, 같은 형식이 다음 리졸버에 다시 전달 된 다음은 최종 DbResolver입니다 레이아웃을 찾으려고합니다. 레이아웃은 기본적으로보기와 같은 형식이어야하기 때문에 그럴 것이라고 가정합니다. 나는 그것이 합리적이라고 생각한다.

레일스가 괜찮은 문서를 가지고 있다면 확실히 좋을 것입니다!