如何将我的主项目布局用于我的子应用程序?
控制器有一个布局选项..但是为了让它遍历回父项目并使用它的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中使用代码不会产生错误,但它也不会呈现布局。只是查看结果。
答案 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