Reputation: 1845
I'm trying to make a JS snippet work in a concrete page with Rails 4 and Turbolinks. I've tried with the standard solution:
<script type="text/javascript">
var ready = function() {
// Bla bla
};
$(document).ready(ready);
$(document).on('page:load', ready);
</script>
But it doesn't seem to work. My snippet is something like this:
<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>
The snippet doesn't work as expected (even with the standard solution) and finally I just want to disable Turbolinks in this page.
How can i do it?
-- Solution
<% content_for :body do %>
<% if controller.controller_name == 'home' && controller.action_name == 'demo1' %>
<body data-no-turbolink="true">
<% end %>
<% end %>
Upvotes: 50
Views: 35929
Reputation: 1398
Add “data-no-turbolink” to the <body> tag
of the the page you want it disabled on
If you have a shared layout file which i am assuming you do, you can do an if statement and check the params[:controller] and params[:action] and just add it to the one area
Edited Jan 2021: As pointed out by @weltschmerz under rails 5 data-turbolinks="false"
is the preference.
Upvotes: 50
Reputation: 4052
I had a situation in a Rails 5.2.4.4 app where I had a script working before I added turbolinks. All I did was include turbolinks in application.js. Doing that broke my working script. I did several things in application.html.erb to get turbolinks working on a single page.
I used the solution of @Coherent for the body statement. I also retrieve the action and controller values to use in my turbolinks script.
<% 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 %>
This is how I wrote my turbolinks script in the head section. When I look at the source the turbolinks script is included on the selected page. Otherwise the comment appears on the page.
<% if params[:action] == "action_name" && params[:controller] == "controller_name" %>
<script>
my turbolinks script logic here
</script>
<% else %>
<!-- some logic here -->
<% end %>
I tried disabling each link by adding data-turbolinks="false"
on the page where my original script was working. I could not get it to work. I added the following statement to the head section. I found this here in the Turbolinks documentation. If all else fails this statement seems to work.
<meta name="turbolinks-visit-control" content="reload">
Both scripts work as expected.
Upvotes: 0
Reputation: 2126
Here's a solution in Haml
with Rails 5.2.1
In your application.haml
:
%body{data: {turbolinks: (content_for :turbolinks)}}
In your template.haml
:
- content_for :turbolinks {"false"}
Upvotes: 2
Reputation: 35169
Here's a cleaner solution:
In /app/views/layouts/application.html.erb
, replace the <body>
tag with this:
<body
<% if content_for?(:body_attributes) %>
<%= yield(:body_attributes) %>
<% end %>>
Now, if you want to disable turbolinks in a particular view, e.g. /app/views/home/index.html.erb
, you can add this to the file:
<% content_for(:body_attributes) do %>
data-no-turbolink="true"
<% end %>
and that will end up rendering as:
<body data-no-turbolink="true">
In Rails 5, the syntax is slightly different:
<% content_for(:body_attributes) do %>
data-turbolinks="false"
<% end %>
and that will end up rendering as:
<body data-turbolinks="false">
Upvotes: 77
Reputation: 1415
This worked.
Where ever the link is to the page do something like this
%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'
Upvotes: 0
Reputation: 359
For anyone is already using rails 5. If you want to disable entire turbolink for a specific page, just add this line "data-turbolinks='false'" to the body of that page:
<body data-turbolinks="false">
Upvotes: 1
Reputation: 41884
Just a slightly modified version of fearless_fool's answer, which rendered strangely due to white space and quotes:
Application.html.erb
<body <%= yield(:body_attributes) %>>
View.html.erb
<%= content_for(:body_attributes, 'data-no-turbolink') %>
Upvotes: 11
Reputation: 1079
Solutions on here didn't work for me, turns out Turbolinks changed the syntax for disabling Turbolinks on a single page in their new release (5.0.0).
To disable it on a page with Turbolinks 5.0.0+, add data-turbolinks="false"
to the links of the page you want to disable:
<a href="/link" data-turbolinks="false">Page without Turbolinks</a>
It also works on any of the links' ancestors, so in this example both links will lead to non-turbolinked pages:
<div data-turbolinks="false">
<a href="/link1">Page without Turbolinks</a>
<a href="/link2">Another page without Turbolinks</a>
</div>
To enable it on a single link with all the other links disabled in a specific element:
<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>
I also tried adding it to the body of the page I want it disabled on, similar to the old method but with using data-turbolinks="false"
instead of data-no-turbolink="true"
- and that worked too!
Source: Turbolinks on GitHub
Upvotes: 18
Reputation: 1
Here is a solution that works by disabling turbolinks on the page that a link links to. In this case, the 'edit post' page:
<%= link_to 'Edit', edit_post_path(@post), 'data-no-turbolink' => true %>
Upvotes: 0
Reputation: 2113
Here is an alternative way to code this up, I just choose which tag to display based on the controller name.
<html>
<head></head>
<% if controller.controller_name == 'subscriptions' %>
<body data-no-turbolink>
<% else %>
<body >
<% end %>
Add the rest of my body here...
</body>
</html>
Upvotes: 4