Rails 4:在特定页面中禁用Turbolinks

时间:2014-03-11 12:59:57

标签: javascript ruby-on-rails ruby turbolinks

我正在尝试使用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>

该代码段无法按预期工作(即使使用标准解决方案),最后我只想在此页面中禁用Turbolink。

我该怎么做?

- 解决方案

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

10 个答案:

答案 0 :(得分:62)

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

/app/views/layouts/application.html.erb中,将<body>标记替换为:

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

现在,如果要在特定视图中禁用turbolink,例如/app/views/home/index.html.erb,您可以将其添加到文件中:

for Rails 4

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

并最终呈现为:

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

for Rails 5

在Rails 5中,语法略有不同:

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

并最终呈现为:

<body data-turbolinks="false">

答案 1 :(得分:47)

添加您要禁用的页面的“data-no-turbolink” to the <body> tag

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

答案 2 :(得分:15)

这里的解决方案对我来说没有用,事实证明Turbolinks在新版本(5.0.0)中更改了在单个页面上禁用Turbolinks的语法。

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

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

它也适用于任何链接&#39;祖先,所以在这个例子中,两个链接都会导致非涡旋页面:

<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

答案 3 :(得分:11)

只是一个稍微修改过的fearless_fool的答案,由于空格和引号而奇怪地呈现:

<强> Application.html.erb

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

<强> View.html.erb

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

答案 4 :(得分:3)

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

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

     Add the rest of my body here...

     </body>
   </html>

答案 5 :(得分:1)

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

<body data-turbolinks="false">

答案 6 :(得分:1)

这是HamlRails 5.2.1的解决方案

在您的application.haml中:

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

在您的template.haml中:

- content_for :turbolinks {"false"}

答案 7 :(得分:0)

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

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

答案 8 :(得分: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'

答案 9 :(得分:0)

我在Rails 5.2.4.4应用程序中遇到了一种情况,在添加Turbolink之前,我的脚本可以正常工作。我所做的只是在application.js中包含了涡轮链接。这样做破坏了我的工作脚本。我在application.html.erb中做了几件事,以使Turbolink在单个页面上工作。

我将@Coherent的解决方案用于body语句。我还检索了要在我的turbolinks脚本中使用的action和controller值。

<% 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文档中找到了这个here。如果所有其他方法都失败,则此语句似乎有效。

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

两个脚本都能正常工作。