【问题标题】:js.erb rendered into layout, not executedjs.erb 渲染到布局中,未执行
【发布时间】:2025-12-04 09:05:02
【问题描述】:

我正在尝试使用简单的 link_to 和操作来更新跨度。当我点击链接时,视觉上“什么都没有发生”,(页面没有改变)。

查看对请求的响应,我看到我的布局,其中 js.erb 文件的内容插入到布局产生的位置。

我的环境是在 OS X 上的 Docker 下运行的 Rails 4.2 以及 AWS 上的 Elastic Beanstalk。

app/views/admin/games.haml:
%p=link_to("Hint please", {:action=> "hint"}, :remote => true)

%span#hint
  where next?

app/controllers/admin_controller.rb:

  def hint
    respond_to do |format|
      format.js
    end
  end

app/views/admin/hint.js.erb:

$("#hint").text('hello coffee');

rails 登录点击链接:

Started GET "/admin/hint" for 192.168.99.1 at 2016-03-14 12:04:33 +0000
Cannot render console from 192.168.99.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by AdminController#hint as JS
    Rendered admin/hint.js.erb within layouts/admin (0.0ms)
    Rendered application/_favicon.haml (8.9ms)
Completed 200 OK in 197ms (Views: 196.0ms | ActiveRecord: 0.0ms)

我按照https://www.alfajango.com/blog/rails-js-erb-remote-response-not-executing/ 的调试说明进行操作 - 我没有看到任何 Javascript 错误。响应是布局,其中 .js.erb 的内容呈现为文本,其中 yield 命令位于布局中:

<div id='main'>
    <div class='header'>
        <h1></h1>
        <h2></h2>
    </div>
    <div class='content'>
        $("#hint").text('hello coffee');
    </div>
</div>

这让我发疯了,谢谢你的帮助。

【问题讨论】:

  • 只需从提示方法中删除 respond_to。无需重定向、渲染和响应。
  • @prashu 感谢您的评论。这没有帮助。 BoraMa 下面的回答为我解决了这个问题。

标签: javascript jquery ruby-on-rails ajax


【解决方案1】:

也许你受到Rails bug/feature #10768的困扰?

即,如果您的主布局被称为 application.haml 而不是 application.html.haml,则会发生这种行为。这是因为默认情况下会为所有格式呈现没有格式扩展名的布局。

我可以看到你正在使用 HAML,所以我猜这可能是它。

【讨论】:

  • 就是这样,谢谢。我发现如果我重命名以下所有内容:application.haml -> application.html.haml,特定控制器的布局 admin.haml -> admin.html.haml,以及操作视图 games.haml -> games.html .ham - 它在第一次点击时起作用。 (除非我也重命名 application.haml,否则它不起作用)。我现在可以看到github.com/mohitjain/ajaxified_scaffold/tree/master/app 的演示应用程序使用了类似的文件名结构。我还管理一个 Rails 2 应用程序,它成功地使用了一个普通的 .haml 扩展名,所以我猜这就是我走这条路的部分原因。再次感谢。