【问题标题】:Rails 4: disable Turbolinks in a specific pageRails 4:在特定页面中禁用 Turbolinks
【发布时间】:2026-01-03 19:35:01
【问题描述】:

我正在尝试使用 Rails 4 和 Turbolinks 使 JS sn-p 在具体页面中工作。我已经尝试过标准解决方案:

<script type="text/javascript">

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

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

但它似乎不起作用。我的 sn-p 是这样的:

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

sn-p 无法按预期工作(即使使用标准解决方案),最后我只想在此页面中禁用 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”等相关?这将是一个很好的解决方案,因为我想将 turbolink 限制为除索引页面之外的所有内容。

标签: javascript ruby-on-rails ruby turbolinks


【解决方案1】:

这是一个更清洁的解决方案:

/app/views/layouts/application.html.erb 中,将&lt;body&gt; 标记替换为:

<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">

【讨论】:

  • 我认为这比公认的答案要干净得多,尤其是在您有许多控制器和操作的情况下。这救了我的培根两次!
  • 这对我不起作用,使用 rails 5 和 turbolinks 5,我也将语法更改为 data-turbolinks=false
  • @icemelt:让我知道更新的答案是否适合您。
  • @fearless_fool 它仍然无法正常工作,但如果我使用 :body_attributes 对其进行硬编码,则它可以工作
【解决方案2】:

添加您希望禁用它的页面的“data-no-turbolink” to the &lt;body&gt; tag

如果你有一个我假设你有的共享布局文件,你可以做一个 if 语句并检查 params[:controller] 和 params[:action] 并将其添加到一个区域

2021 年 1 月编辑:正如 @weltschmerz 在 rails 5 下指出的那样,data-turbolinks="false" 是首选。

【讨论】:

  • 这已经过时了,它需要说 data-turbolinks="false" 从 Rails 5 开始,请参阅fearless_fool 的答案。
  • @weltschmerz 这个问题是专门针对 Rails 4 的,但是很好……
【解决方案3】:

这里的解决方案对我不起作用,原来 Turbolinks 在其新版本 (5.0.0) 中更改了在单个页面上禁用 Turbolinks 的语法。

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

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

它也适用于任何链接的祖先,因此在此示例中,两个链接都将指向非涡轮链接页面:

<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" - 这也有效!

来源:Turbolinks on GitHub

【讨论】:

    【解决方案4】:

    fearless_fool 答案的略微修改版本,由于空格和引号而呈现奇怪:

    Application.html.erb

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

    View.html.erb

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

    【讨论】:

      【解决方案5】:

      这是另一种编码方式,我只是根据控制器名称选择要显示的标签。

          <html>
            <head></head>
            <% if controller.controller_name == 'subscriptions' %>
              <body data-no-turbolink>
            <% else %>
              <body >
            <% end %>
      
           Add the rest of my body here...
      
           </body>
         </html>
      

      【讨论】:

        【解决方案6】:

        这是HamlRails 5.2.1 中的解决方案

        在你的application.haml:

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

        在你的template.haml

        - content_for :turbolinks {"false"}
        

        【讨论】:

          【解决方案7】:

          对于已经在使用 rails 5 的任何人。如果您想禁用特定页面的整个 turbolink,只需将这一行“data-turbolinks='false'”添加到该页面的正文:

          <body data-turbolinks="false">
          

          【讨论】:

            【解决方案8】:

            这是一个解决方案,它通过在链接链接到的页面上禁用 turbolinks 来工作。在这种情况下,“编辑帖子”页面:

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

            【讨论】:

              【解决方案9】:

              这行得通。

              页面的链接在哪里做这样的事情

                %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'
              

              【讨论】:

                【解决方案10】:

                我在 Rails 5.2.4.4 应用程序中遇到过这样的情况,在我添加 turbolink 之前,我有一个脚本可以运行。我所做的只是在 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 %>
                

                这就是我在 head 部分中编写 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" 来禁用每个链接。我无法让它工作。我在 head 部分添加了以下语句。我在 Turbolinks 文档中找到了这个 here。如果所有其他方法都失败,则此语句似乎有效。

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

                两个脚本都按预期工作。

                【讨论】:

                  最近更新 更多