Rails 4和Turbolinks-元标记不改变

14

我有一个启用了TurboLinks的Rails 4应用程序,但是当更改页面(而不是进行完全刷新)时,无法使元标记(meta tags)刷新。我读到说需要在加载TurboLinks的JavaScript之前包含元标记,但是这没有效果。完全刷新可以解决问题,但不幸的是这不是我要找的。

layout/application.html.haml

%html
  %head
    %title= "Title"
    - if content_for?(:meta_description)
      %meta{content: (yield :meta_description), name: "description"}/
      %meta{content: (yield :meta_keywords), name: "keywords"}/
    = stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true 
    = javascript_include_tag "application", "data-turbolinks-track" => true

    = csrf_meta_tags
  %body{class: params[:controller].gsub("/", "-"), id: 'top'}
    = render "shared/header"
    .body-content
      = render "shared/flash"
      = yield
    = render "shared/footer"
    = render "shared/analytics"

helpers/application_helper.rb

def meta_tag(title, description)

content_for :meta_keywords do
  title
end

content_for :meta_description do
  description
end   

这就是我称呼他们的方式

end

= meta_tag('here s my title', 'and the keywords')

谢谢


1
我知道这并没有真正帮助或回答问题,但大多数搜索引擎不再使用元关键字。 - user1746971
除了 CSRF 令牌之外,为什么需要在客户端刷新元标记? - nurettin
4个回答

24

Turbolinks的工作原理

Turbolinks旨在保持<head>标签不变,仅通过AJAX请求用所请求页面的内容替换<body>标签。由于<meta>标签位于<head>中,因此它们在Turbolinks请求中不会被更改。

对SEO的影响

从SEO角度来看,你不必担心<meta>标签在Turbolinks请求中更新,因为搜索引擎爬虫始终会进行完整的页面请求,并且不会执行Turbolinks javascript。

从用户角度来看,每个请求都需要更改的唯一标签是<title>标签,因此Turbolinks本身内置了特殊处理。

这种行为会改变吗?

这个“问题”已经被提出并多次驳回,DHH本人宣布这不是问题,因此我不会指望这种行为很快会发生改变。

详见:


我已经禁用了Turbolinks。但是,我的页面仍然没有完全重新加载。它不会更改头标签,并且不会通过content_for标记加载特定于页面的CSS。你能建议可能是什么问题吗? - Sonali Gupta
我很乐意帮助您解决问题,但您应该将其作为单独的SO帖子发布,以便社区的其他成员也可以提供帮助。请尽可能包含详细信息,包括如何禁用Turbo Links。发布新问题的链接,我会尽力帮助。 - Carlos Ramirez III
1
<head> 中另一个受影响的标签是 <meta property="og:image" content="...。有没有人更改过这个标签,以获得一个漂亮的 Facebook 分享者? - Albert Català
1
今天这个说法还适用吗?“搜索引擎爬虫总是会进行完整的页面请求,不会执行Turbolinks JavaScript。” - bryanus
不同于早期版本,Turbolinks v5以上的版本会更新文档<head>中的 meta 标签和其他临时元素。 - Sbbs

2

这是一个Turbolinks的问题

按照设计,Turbolinks会保持页面的<head>不变,并通过ajax调用文档的<body>,如果它将保持不变(您正在使用相同的控制器/操作)。这是一种保持应用程序性能的疯狂方式。

这里有一个Turbolinks的好解释


我遇到了类似的Javascript问题,能够使用Jquery-Turbolinks gem来保持JS渲染

对于您的meta标签,虽然我目前没有解决方案,但我找到了一个不错的gem,您可能会从中受益:MetaMagic。它允许您在视图中定义元标记,就像content_block工具一样工作。这应该在每个http请求上加载


1
我尝试了元编程,但没有帮助。据我所知,元编程基本上做的是相同的事情,在头部使用“yield”,在视图中使用“content_for”,因此来自头部的元标记仍然没有改变。无论如何,感谢您的回答 :) - vladCovaliov
没问题 - 如果我发现了什么,我会为您更新答案! - Richard Peck
我现在有一个类似的问题。这个话题上有什么新进展吗? - MarkoHiel
你好,也许我们可以帮忙。 - Richard Peck
没有什么新的进展,我还是没有答案。不过好消息是,谷歌会获取网页上的所有链接,并单独渲染每一个链接,因此从SEO角度来看,元标签仍然发挥着它们的作用。 - vladCovaliov

1

非常感谢你的分享。虽然离开网站的链接可能会失效,因此请考虑在这里添加或解释您的扩展。 - Sebastian Lange

0

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