渲染布局存储在数据库中

发布于 2024-11-15 22:16:56 字数 400 浏览 3 评论 0原文

在与另一个站点进行一些集成工作时,我有一个不寻常的要求,即需要在运行时创建布局。

目前我不得不求助于这样的事情:

def new
  body = render_to_string 'new', :layout => false      
  page = add_layout(body, db.load_template)
  render :text => page
end

这有点尴尬,我宁愿做这样的事情:

def new
  ...
  render 'new', :layout => db.load_template
end

有没有更干净的方法来做到这一点?也许可以在运行时注册新布局并使用正常语法?

Doing some integration work with another site I've got the unusual requirement of needing to create the layout at runtime.

At the moment I'm having to resort to something like this:

def new
  body = render_to_string 'new', :layout => false      
  page = add_layout(body, db.load_template)
  render :text => page
end

This is a bit awkward, I'd rather do something like:

def new
  ...
  render 'new', :layout => db.load_template
end

Is there a cleaner way to do this? Perhaps it's possible to register new layouts at runtime and use the normal syntax?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北风几吹夏 2024-11-22 22:16:56

哈!我遇到了一个可以解决这个问题的项目。查看全景。它将 Rails 视图存储在数据库而不是文件系统中。

Ha! I encountered a project that will solve just that. Check out panoramic. It stores rails views in the database instead of the filesystem.

み青杉依旧 2024-11-22 22:16:56

您可以使用模块和 alias_method_chain 扩展 ActionController::Base (或 ApplicationController)来实现此功能。

module Foo

  alias_method_chain :render, :dblayout

  def render_with_dblayout options = nil, extra_options = {}, &block
   if options.include? :dblayout
     ...
   else
     render_without_dblayout options, extra_options { yield }
   end
  end
end

ActionController::Base.send(:include, Foo)

You can extend ActionController::Base (or ApplicationController) with a module and alias_method_chain to make this work.

module Foo

  alias_method_chain :render, :dblayout

  def render_with_dblayout options = nil, extra_options = {}, &block
   if options.include? :dblayout
     ...
   else
     render_without_dblayout options, extra_options { yield }
   end
  end
end

ActionController::Base.send(:include, Foo)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文