Ruby on rails 自定义ActionView::解析器忽略布局
我创建了一个自定义的Ruby on rails 自定义ActionView::解析器忽略布局,ruby-on-rails,ruby-on-rails-3,actionview,Ruby On Rails,Ruby On Rails 3,Actionview,我创建了一个自定义的ActionView::Resolver,从数据库而不是文件系统中提取视图。它很有效——很好,几乎可以。它可以正确地拉动和渲染视图,但不会在布局内部渲染视图!基本上,结果是一个只有视图部分的页面(没有布局、样式等)。以下是我正在做的: DbResolver class DbResolver < ActionView::Resolver require "singleton" include Singleton @@view_handler = Action
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
class BaseController < ApplicationController
layout "public"
end
class ContactController < BaseController
prepend_view_path Page.resolver
def index
end
end
解决了!我真的不知道这是怎么导致这个问题的,但这个解决方案是有效的。我将
: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? && !@exclude_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
classdbresolver前缀,:action\u name=>name}”)
return pages.collect{| page|
ActionView::Template.new(page.content,“#{page.class}-#{page.id}-#{page.controller_name}/#{page.action_name}”,@@view_handler{
:format=>(详细信息[:format]| |“html”),
:updated_at=>page.updated_at,
:virtual_path=>“#{page.controller_name}/#{page.action_name}”
})
}
结束
返回[]
结束
结束
也许有人可以解释为什么当我创建第一个模板(对于about/index)时,:format
设置“卡住了”,当解析器试图查找布局时,相同的格式被传递回解析器。我假设这是因为默认情况下,布局应与视图的格式相同。我想这是有道理的
如果Rails有一些像样的文档,那就太好了
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}"
})
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? && !@exclude_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