Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 自定义ActionView::解析器忽略布局_Ruby On Rails_Ruby On Rails 3_Actionview - Fatal编程技术网

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