Padrino:在主项目和子应用之间共享布局

时间:2012-02-04 04:28:16

标签: layout padrino

如何将我的主项目布局用于我的子应用程序?

控制器有一个布局选项..但是为了让它遍历回父项目并使用它的application.haml,我会将值设置为什么?

我尝试添加:

File.expand_path('../../app/views/layouts/application.haml', __FILE__)

不幸的是,在控制器中,它看起来像当前应用程序布局文件夹的路径总是被添加到它的前面,所以你最终会得到像

这样的东西
c:/sites/demo/app01/views/layouts/c:/sites/demo/app/views/layouts/application.haml

此外,已添加.haml,因此如果您将其添加到控制器,则最终会使用

application.haml.haml

这只是控制器的情况。

基于这些结果,我将代码移动到子app.rb中,这实际上对我的情况更好。

但是,没有渲染主布局,因此我只看到当前控制器操作的结果。它不输出布局。

我尝试了没有文件ext,等等。返回的路径是正确的..所以我不确定为什么它不使用它?

至少在控制器中,它抛出一个错误,因为它是一个无效的参数。

在我的子应用程序的app.rb中使用代码不会产生错误,但它也不会呈现布局。只是查看结果。

3 个答案:

答案 0 :(得分:0)

您可以在主应用程序或控制器中使用:

# in project/parent_app/sub_app/app.rb
layout File.expand_path('../../parent_app/views/application.haml', __FILE__)

这将呈现:

# project/parent_app/views/application.haml

答案 1 :(得分:0)

当你指定一个abs文件路径时,我花了一点时间来查看控制器问题在哪里,等待当前应用程序布局文件夹的布局。

文件: padrino-core / application / rendering.rb

方法: fetch_layout_path

我添加了if / else来检查是否有abs文件路径。

return cached_layout_path if cached_layout_path
if File.exists?(layout_name.to_s)
    layout_path = layout_name.to_sym
else
    has_layout_at_root = Dir["#{views}/#{layout_name}.*"].any?
    layout_path = has_layout_at_root ? layout_name.to_sym : File.join('layouts', layout_name.to_s).to_sym
    end
@_cached_layout[layout_name] = layout_path unless reload_templates?
layout_path

然而,它仍然是错误的。

档案: sinatra-1.3.2 / lib / sinatra / base.rb

方法: find_template

我添加了

yield name.to_s if File.exists?(name.to_s)

之前

yield ::File.join(views, "#{name}.#{@preferred_extension}")

这没有任何错误。

我对红宝石很新,对sinatra / pandrino来说更是如此,所以这可能不是正确的方法,但它有效并且可以让我继续推进我目前的发展。

DAddYE:我有兴趣听取您关于更好的替代方案的回复?我不确定为什么在子应用程序的app.rb中设置布局似乎没有做任何事情,我稍后会尝试调查。

答案 2 :(得分:0)

fetch_layout_path 必须是相对路径。 所以你应该在 padrino-core / application / rendering.rb 中这样做:

这对我有用。但是,如果padrino允许嵌套的子应用程序,那么这不是完美的方式。

  def fetch_layout_path(given_layout=nil)
    layout_name = given_layout || @layout || :application
    @_cached_layout ||= {}
    cached_layout_path = @_cached_layout[layout_name]
    return cached_layout_path if cached_layout_path
    has_layout_at_root = Dir["#{views}/#{layout_name}.*"].any?
    layout_path = has_layout_at_root ? layout_name.to_sym : File.join('layouts', layout_name.to_s).to_sym
    # Check the layout file is exists in sub-app? 
    # try to use the root project's layout if not
    # added via riceball
    has_layout = Dir["#{views}/#{layout_path}.*"].any?
    layout_path = has_layout ? layout_path : File.join('..', '..', 'app', 'views', layout_path.to_s).to_sym
    @_cached_layout[layout_name] = layout_path unless reload_templates?
    layout_path
  end