出于搜索引擎优化的原因,我想向谷歌提供有关我们杂志的更多信息,这是我们网站的一部分。 Google认识到存在分页内容。所以我被告知要为杂志的每一页添加next
和prev
元标记/链接(例如第3页):
<link rel="prev" href="http://www.bla.com/de/magazin?page=2" />
<link rel="next" href="http://www.bla.com/de/magazin?page=4" />
我们正在使用JSON与Kaminari gem分页我们的文章。
这是magazine_controller
的索引操作:
def index
@articles = MagazineArticle.visible
.includes(:magazine_category)
.order(published_at: :desc)
.page(params[:page]).per(7)
@slider_articles = @articles.first(3)
@advertisement = Advertisement.for_start_page
#set_pagination_meta_tags(params[:page])
set_magazine_meta_tags
respond_to do |format|
format.html
format.json { render_new_page(@articles, @advertisement) }
end
end
# the method that renders the new page (as JSON)
def render_new_page(articles, advertisement)
render json: {
content: {
articles: render_to_string(
partial: 'magazine/article_page',
locals: { articles: articles, advertisement: advertisement }
),
link: render_to_string(
partial: 'magazine/load_more_button',
locals: { articles: articles }
)
}
}
end
我们也使用Metatags gem来处理元标记。
我写了一个添加相对于的链接的方法 当前页面使用我在索引操作中调用的方法 正如您在上面的控制器代码中看到的那样:
def set_pagination_meta_tags(page)
page = page.to_i
case page
when 0..1
set_meta_tags(next: magazine_url(I18n.locale, page: 2))
when @articles.total_pages
set_meta_tags(prev: magazine_url(I18n.locale, page: @articles.total_pages - 1))
when 2..@articles.total_pages - 1
set_meta_tags(prev: magazine_url(I18n.locale, page: page-1))
set_meta_tags(next: magazine_url(I18n.locale, page: page+1))
end
end
但是这只适用于第一页,然后JSON用于导航/加载更多,这不会更改元标记。
在深入研究之前,我想知道:是否可以设置这些链接?这种(动态)分页是否有意义? 谢谢!
答案 0 :(得分:2)
与您已经使用的类似,您可以返回包含
的一些渲染的meta_pagination部分= rel_next_prev_link_tags @articles
您的render_new_page
看起来像这样
def render_new_page(articles, advertisement)
render json: {
content: {
articles: render_to_string(
partial: 'magazine/article_page',
locals: { articles: articles, advertisement: advertisement }
),
link: render_to_string(
partial: 'magazine/load_more_button',
locals: { articles: articles }
),
meta_pagination: render_to_string(
partial: 'layouts/meta_pagination',
locals: { articles: articles }
)
}
}
end
(调整meta分页部分的路径)
然后在你的javascript中删除rel next / prev
$("head link[rel='next']").remove();
$("head link[rel='prev']").remove();
并使用
将新内容附加到html头部$('head').append(metaPagination);
var metaPagination = response.content.meta_pagination;
答案 1 :(得分:1)
Kaminari实际上会为您执行此操作 - 请参阅此处的相关文档:https://github.com/kaminari/kaminari#the-rel_next_prev_link_tags-helper-method
如果您想深入研究实现,那么看起来这是添加它的PR:https://github.com/kaminari/kaminari/pull/200/files
TLDR - 将此添加到您的视图
# In head:
<head>
<%= yield :head %>
</head>
# Somewhere in body:
<% content_for :head do %>
<%= rel_next_prev_link_tags @articles %>
<% end %>