Rails:next / prev元数据用于带有JS分页的索引页面

时间:2017-03-07 11:05:02

标签: ruby-on-rails pagination

出于搜索引擎优化的原因,我想向谷歌提供有关我们杂志的更多信息,这是我们网站的一部分。 Google认识到存在分页内容。所以我被告知要为杂志的每一页添加nextprev元标记/链接(例如第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用于导航/加载更多,这不会更改元标记。

在深入研究之前,我想知道:是否可以设置这些链接?这种(动态)分页是否有意义? 谢谢!

2 个答案:

答案 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 %>