Rails 4:在特定页面禁用Turbolinks

50

我正在尝试在使用Rails 4和Turbolinks的具体页面中使JS代码片段工作。我已经尝试了标准解决方案:

<script type="text/javascript">

    var ready = function() {
        // Bla bla
    };

    $(document).ready(ready);
    $(document).on('page:load', ready);
</script>

但似乎不起作用。我的代码片段如下:

<script type="text/javascript">
  function ismready() 
  {
    var API_KEY = "api key";
    var roomId  = "room id";
    var ism = new Ismuser(API_KEY, roomId);
    ism.init({
      board: {
        layer: "board"
      },
      video: {
        camsContainer: "guest"
      },
      chat: {
        layer: "chat"
      },
      moderator: true,
    });
  }
</script>
<script src="http://assets.ismuser.com/v0.4/js/ismuser.js" type="text/javascript"></script>

这段代码无法按照预期工作(即使使用了标准解决方案),最终我只想在此页面禁用Turbolinks。

我该如何做?

-- 解决方案

<% content_for :body do %>
    <% if controller.controller_name == 'home' && controller.action_name == 'demo1' %>
        <body data-no-turbolink="true">
    <% end %>
<% end %>

action_name是否与“index”、“edit”等相关?这将是一个很好的解决方案,因为我想将turbolinks限制在除索引页面以外的所有页面。 - onebree
10个回答

77

这里有一个更简洁的解决方案:

/app/views/layouts/application.html.erb 文件中,将 <body> 标签替换为以下内容:

<body 
  <% if content_for?(:body_attributes) %>
    <%= yield(:body_attributes) %> 
  <% end %>>

如果您想在特定视图中禁用Turbolinks,例如 /app/views/home/index.html.erb,您可以将以下内容添加到文件中:

适用于Rails 4

  <% content_for(:body_attributes) do %>
    data-no-turbolink="true"
  <% end %>

然后这将呈现为:

<body data-no-turbolink="true">

适用于Rails 5

Rails 5中,语法略有不同:

  <% content_for(:body_attributes) do %>
    data-turbolinks="false"
  <% end %>

这将最终呈现为:

<body data-turbolinks="false">

3
我认为这比被接受的答案干净得多,特别是当你有许多控制器和操作时。这已经救了我两次! - Adam Denoon
1
这对我不起作用,我正在使用Rails 5和Turbolinks 5,我还将语法更改为data-turbolinks = false。 - buncis
1
@icemelt:如果更新后的答案对您有用,请告诉我。 - fearless_fool
@fearless_fool,它仍然无法工作,但如果我使用“:body_attributes”而不是硬编码,它可以工作。 - buncis

50
“data-no-turbolink” 添加到您想要禁用它的页面的 <body> 标签中。
如果您有一个共享的布局文件(我假设您有),可以使用条件语句并检查 params[:controller]params[:action],然后将其添加到相应区域。
2021年1月编辑:根据 @weltschmerz 的指出,在 Rails 5 中,首选为 data-turbolinks="false"

这已经过时了,从 Rails 5 开始,它需要说 data-turbolinks="false",请参见 fearless_fool 的答案。 - Dennis Hackethal
@weltschmerz 这个问题特别涉及到Rails 4,但你说得很对... - SteveTurczyn

18
以下是翻译的结果:

这里的解决方法对我不起作用,结果发现Turbolinks在他们的新版本(5.0.0)中更改了在单个页面上禁用Turbolinks的语法。

要在使用Turbolinks 5.0.0+的页面上禁用它,请将data-turbolinks="false"添加到您希望禁用的页面链接中:

<a href="/link" data-turbolinks="false">Page without Turbolinks</a>

它还适用于任何链接的祖先元素,因此在这个示例中,两个链接都将导向非turbolink页面:
<div data-turbolinks="false">
  <a href="/link1">Page without Turbolinks</a>
  <a href="/link2">Another page without Turbolinks</a>
</div>

要在特定元素中仅启用单个链接并禁用所有其他链接:

<div data-turbolinks="false">
  <a href="/link1">Page without Turbolinks</a>
  <a href="/link2">Another page without Turbolinks</a>
  <a href="/link3" data-turbolinks="true">Page with Turbolinks enabled</a>
</div>

我也尝试将其添加到要禁用它的页面的正文中,类似于旧方法,但使用data-turbolinks ="false"而不是data-no-turbolink ="true" - 这也起作用了!
来源:GitHub上的Turbolinks

11

这只是稍微修改过的 fearless_fool 的答案,由于空格和引号的原因渲染出现问题:

Application.html.erb

<body <%= yield(:body_attributes) %>>

View.html.erb

<%= content_for(:body_attributes, 'data-no-turbolink') %>

4

这里有一种替代的编码方式,我根据控制器名称选择要显示的标签。

    <html>
      <head></head>
      <% if controller.controller_name == 'subscriptions' %>
        <body data-no-turbolink>
      <% else %>
        <body >
      <% end %>

     Add the rest of my body here...

     </body>
   </html>

2

以下是在 Rails 5.2.1 中使用 Haml 的解决方案:

在你的 application.haml 文件中:

  %body{data: {turbolinks: (content_for :turbolinks)}}

在你的template.haml文件中:
- content_for :turbolinks {"false"}

1

如果你正在使用Rails 5,想要禁用某个页面的整个Turbolink,只需将这行代码"data-turbolinks='false'"添加到该页面的body标签中即可:

<body data-turbolinks="false">

0

这个可行。

无论链接指向哪个页面,都可以像这样做些什么

  %div{"data-turbolinks" => "false"}
    = link_to 'Send payment', new_payments_manager_path(sender_id: current_user.id, receiver_id: @collaboration.with(current_user).id, collaboration_id: params[:id]), class: 'button'

0

这里是一种解决方案,通过在链接到页面上禁用Turbolinks来实现。在这种情况下,是'编辑帖子'页面:

<%= link_to 'Edit', edit_post_path(@post), 'data-no-turbolink' => true %>

0

我在Rails 5.2.4.4应用程序中遇到了一个情况,在添加了turbolinks之前,我有一个正常工作的脚本。我所做的就是在application.js中包含turbolinks。这样做却破坏了我的工作脚本。我在application.html.erb中做了几件事情,以便在单个页面上让turbolinks工作。

我使用了@Coherent的方法来处理body语句。我还检索了操作和控制器的值,以在我的turbolinks脚本中使用。

<% if params[:action] == "action_name" && params[:controller] == "controller_name" %>
  <body data-action='<%= "#{params[:action]}" %>' data-controller='<%= "#{params[:controller]}" %>'>
<% else %>
  <body data-turbolinks="false" data-action='<%= "#{params[:action]}" %>' data-controller='<%= "#{params[:controller]}" %>'>
<% end %>

这是我在头部区域编写Turbolinks脚本的方式。当我查看源代码时,Turbolinks脚本会包含在所选页面中。否则,注释将出现在页面上。
<% if params[:action] == "action_name" && params[:controller] == "controller_name" %>
  <script>
    my turbolinks script logic here
  </script>
<% else %>
  <!-- some logic here -->
<% end %> 

我尝试在原始脚本工作的页面上添加data-turbolinks="false"来禁用每个链接。但是我无法使其正常工作。我在头部区域添加了以下语句。我在Turbolinks文档中找到了这里。如果其他方法都失败了,这个语句似乎可以起作用。

<meta name="turbolinks-visit-control" content="reload">

这两个脚本都按预期工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接