【问题标题】:Why does Rails render RJS templates within a layout?为什么 Rails 在布局中渲染 RJS 模板?
【发布时间】:2011-09-11 01:59:01
【问题描述】:

我需要为使用active_scaffold gem 的控制器执行此操作。我们有一个看起来像这样的控制器:

class Admin::UsersController < ApplicationController
   layout 'admin'

   active_scaffold :users do |config|
     config.search.columns = [:first_name, :last_name]
   end
end

在我们使用 Rails 2.3.10 时效果很好,但我们正在升级到 Rails 3.0.10。作为升级的一部分,我必须升级active_scaffold(目前从git://github.com/activescaffold/active_scaffoldrails-3.0 分支安装)以兼容。我们遇到的一个问题是搜索表不起作用。我会在我的日志文件中看到:

Rendered <snip>/gems/active_scaffold-25b3d724f35b/frontends/default/views/list.js.rjs within layouts/admin (923.5ms)

请注意,它使用控制器中指定的布局呈现 RJS 模板。这对我来说似乎是一个不合理的默认值。不应该 RJS 模板呈现 布局默认情况下?无论如何,我把它修好了:

class Admin::UsersController < ApplicationController
  layout :admin_layout

  private

  def admin_layout
    respond_to do |format|
      format.js   { false }
      format.html { 'admin' }
    end
  end
end

这解决了搜索和分页的问题。 (现在渲染 RJS 模板时没有布局,因此浏览器可以执行生成的 Javascript)。我想我的问题是,为什么我必须告诉 Rails 它不应该渲染带有布局的 RJS 模板?有没有更好的解决方案?对我来说,这感觉太过分了(糟糕的 hack —— 将来会被破坏的那种 hack)。

【问题讨论】:

  • 我没有告诉 Rails 3.0.9 渲染 JS 没有模板;有没有可能是 active_scaffold 里的东西?
  • layouts/admin.js吗?这是奇怪的行为。 Rails 不应该在 HTML 布局中呈现 JS 模板。另一方面,如果有 JS 布局...
  • @Dave Newton 这就是我的想法。它必须是 active_scaffold 中的东西。 @numbers1311407 不,没有layouts/admin.js。我检查了响应的内容,它在 HTML 布局中包装了 RJS 模板。

标签: ruby-on-rails ruby-on-rails-3 activescaffold


【解决方案1】:

好的,我想通了。 @numbers1311407 在我的问题下的评论使我检查了布局模板的名称。是layouts/admin.haml。在 Rails 2 中,该布局只为 HTML 请求呈现,但在 Rails 3 中,它适用于所有请求(因为它没有指定格式类型)。我将它重命名为layouts/admin.html.haml,它可以在我的控制器中使用一个简单的layout 'admin'(与我在问题中提出的hack相反)。

所以问题的答案是“为什么 Rails 会在布局中呈现 RJS 模板?”是布局文件的命名方式使其适用于所有格式。

【讨论】:

    【解决方案2】:

    回答你的问题:
    1. JS 格式的 Rails 渲染器布局没有什么魔力。这是因为 Rails 默认使用任何模板呈现布局,除非您明确告知要避免它。您可以查看文件中的 Rails 源代码:actionpack/lib/action_controller/metal/renderers.rb 以查看 :js 渲染器。

    2.尝试使用:

    respond_to do |format|
      format.js { render *your_any_options*, layout: false }
    end
    

    【讨论】:

    • 不正确;库存 Rails 不会使用 HTML 布局来布局 JS 格式。
    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多