我已经实施了Omniauth和Koala7宝石,以便将我的应用程序与Facebook集成。 一切都运作良好,除了使用自定义对象发布自定义操作的一个小问题。
问题是我的对象网址应该是新创建的帖子的显示页面,例如/ posts / 1。要将此页面识别为facebook对象,我需要将facebook元标记放在 show.html.erb 之上,如下所示:
<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 object debugger将其识别为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>
我假设这是因为对象调试器特别指出:
正文中的元标记:你有标记。这可能是因为您的格式错误并且它们在解析树中降低了,或者您不小心将Open Graph标记放在了错误的位置。无论哪种方式,您都需要在标签可用之前修复它。
那么我该如何解决这个问题呢?
我需要将facebook元标记放在我的show.html.erb
中,但页面本身已经是整个应用程序布局的一部分。
答案 0 :(得分:19)
根据您发布的错误消息,我认为您的元标记不在<head>
中。这是使用content_for
块的一个很好的例子。在show.html.erb视图中,将所需的元标记放入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 %>
然后只需在您的应用程序模板中添加yeild(:head)
即可。您放置在show视图中的html将插入应用程序模板中的此位置。我们在这里检查nil,以便将产量视为可选的。
<head>
<title>sdff</title>
<%= stylesheet_link_tag "application", :media => "all" %>
<%= javascript_include_tag "application" %>
<%= csrf_meta_tags %>
<%= content_for?(:head) ? yield(:head) : '' %>
</head>