在Rails应用程序中放置Facebook元标记

3
我已经使用Omniauth和Koala7宝石将我的应用程序与Facebook集成。 一切都运作良好,唯一的问题是在发布自定义对象的自定义操作时出现了一个小问题。
问题是我的对象URL应该是新创建的帖子的展示页面,例如/posts/1。为了使此页面被识别为Facebook对象,我需要在show.html.erb顶部放置Facebook元标记,就像这样:
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# sdff: http://ogp.me/ns/fb/sdff#">
  <meta property="fb:app_id" content="myid" /> 
  <meta property="og:type"   content="sdff:post" /> 
  <meta property="og:url"    content="<%= "http://sdff.herokuapp.com" + post_path(@post) %>" /> 
  <meta property="og:title"  content="Sample" /> 
  <meta property="og:image"  content="https://fbstatic-a.akamaihd.net/images/devsite/attachment_blank.png" /> 
</head>

问题在于Facebook的对象调试器将其识别为type:webpage而不是type:post。我认为这是因为/layouts/application.html.erb中已经有了默认的head标签,如下所示:
<head>
  <title>sdff</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>

我认为是因为对象调试器明确指出了以下问题:
在body标签之外的Meta标签:您有标签位于body标签之外。这可能是由于您的标签结构不规范,导致它们在解析树中降低了位置,或者您将Open Graph标签放错了位置。无论哪种情况,您都需要在使用标签之前修复它们。
那么我应该如何解决这个问题呢?我需要在我的show.html.erb中放置Facebook的Meta标签,但页面本身已经是整个应用程序布局的一部分,也就是说已经在body标签内了。
1个回答

20
基于您发布的错误信息,我认为您的meta标签未放置在应该放置的中。在这种情况下,使用content_for块非常适合。在您的show.html.erb视图中,将所需的meta标签放入content_for :head块中。这样可以保存html并允许您在布局的其他位置插入它。
<% content_for :head do %>
  <meta property="fb:app_id" content="myid" /> 
  <meta property="og:type"   content="sdff:post" /> 
  <meta property="og:url"    content="<%= "http://sdff.herokuapp.com" + post_path(@post) %>" /> 
  <meta property="og:title"  content="Sample" /> 
  <meta property="og:image"  content="https://fbstatic-a.akamaihd.net/images/devsite/attachment_blank.png" /> 
<% end %>

接着在你的应用模板中添加yield(:head)。你在show视图中放置的HTML将被插入到应用模板的此位置。在这里我们检查是否为空,以便认为yield是可选的。

<head>
  <title>sdff</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
  <%= content_for?(:head) ? yield(:head) : '' %>
</head>

谢谢你的帮助,Greg。我忘记了我可以使用 content_for :) - Maximus S
如果我使用content_for,那么我在哪里放置前缀? - ill_always_be_a_warriors
你的应用程序每个页面的前缀需要不同吗?你可以通过实例变量或者帮助方法来解决。比如, <head <%= @facebook_prefix %>> 这样一个做法可以行得通,只要你在之前设置好了这个变量。 - Greg W

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