Rails在渲染后强制重新加载javascript

时间:2017-09-05 13:30:31

标签: javascript ruby-on-rails render

我在我的rails应用程序中使用了一个表单,最后在我的控制器中检查表单的内容是否正常,如果不是我再次渲染页面解释错误

控制器的一部分

 if @insertion.save
          redirect_to @insertion
        else
          render 'new'
        end

并且在我看来,我有这一行来显示错误。

<% if @insertion.errors.any? %>
    <div id="error_explanation">
      <div class="alert alert-danger">
        The form contains <%= pluralize(@insertion.errors.count, "error") %>.
      </div>
      <ul>
        <% @insertion.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
<% end %>

问题是渲染后页面不会再次加载我的javascript文件,因此视图不像我预期的那样

如何强制在渲染后重新加载js?

由于turbolink,这是我的咖啡文件

$(document).on "turbolinks:load", ->
  insertionJS = new Insertion()
  if $('.insertions.show').length > 0
    console.log("insertions.show")
    insertionJS.showJS() .....continue

1 个答案:

答案 0 :(得分:1)

使用Turbolinks设计JavaScript和CSS不会重新加载,它会将您的链接等转换为XHR请求,然后使用响应更新<body>并触发其特殊事件(也就是jQuery $(function() { ... });执行的操作不能像Turbolinks那样工作。由于它正在进行XHR,它根本不是一个真正的页面加载,即使它看起来像是一个Rails控制器。

对于大多数情况,你可以像你展示的那样使用turbolinks:load事件,但这不是一个magix解决方案,你必须记住你所有的“旧”JavaScript和HTML仍然存在,任何JavaScript“全局”不会重置,等等。

如果您想在每个页面上重新加载/执行JavaScript,只需从您的应用程序中移除Turbolink(Gemfileapplication.js)。如果你为CSS / JS实现了适当的缓存头,并且没有太多的JS,那么性能差异并不大。

如果您只是出于某种原因想要为特定页面/链接/表单禁用它,可以将data-turbolinks="false" attribute添加到该链接。请记住,这需要在通向页面的链接上,而不是页面本身。要使页面本身真正重新加载,您可以像location.reload()那样,但请记住,在渲染/重定向后重新加载完整的单独页面。

如果您真的想强制重新加载JavaScript,可以动态地将另一个<script>插入到头部,但请记住您的原始JavaScript 仍然已加载,因此可能会很痛苦

我注意到Turbolinks实际上非常庞大和复杂,因此值得阅读自己的文档,而不仅仅是Rails的小片段。 https://github.com/turbolinks/turbolinks