1

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(当前从 的rails-3.0分支安装git://github.com/activescaffold/active_scaffold)以兼容。我们遇到的一个问题是搜索表不起作用。我会在我的日志文件中看到:

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)。

4

2 回答 2

4

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

那么这个问题的答案,“为什么 Rails 会在布局中呈现 RJS 模板?” 是布局文件被命名为适用于所有格式。

于 2011-09-11T18:17:36.000 回答
0

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

2.尝试使用:

respond_to do |format|
  format.js { render *your_any_options*, layout: false }
end
于 2011-09-11T04:38:28.407 回答