Проблема со ссылками на страницу will_paginate - PullRequest
6 голосов
/ 05 марта 2012

В настоящее время у меня есть модель комментария, которая публикуется под микросообщением, и оба отображаются на одной странице.Проблема в том, что оба отображаются на одной странице, и оба разбиты на страницы, и я пытаюсь перейти на Facebook подход к микросообщению.Вот проблема ниже:

Ссылки для обеих страниц делятся на href="/users/2?page=2", а не href="/users/2/micropost?page=2" или href="/users/2/comment?page=2".Я не уверен, как решить эту проблему.Вот некоторые из моего кода.Все предложения приветствуются!

Микропост визуализации HTML

<table class="microposts">
<% if microposts.any? %>
<%= render microposts %>
<%= will_paginate microposts, :page_links => false %>
<% else %>
<div class="EmptyContainer"><span class='Empty'>Add a thread!</span></div>
<% end %>
</table>

Раздел комментариев HTML

<div id='CommentContainer-<%= micropost.id%>' class='CommentContainer Condensed2'>
<div class='Comment'>
<%= render :partial => "comments/form", :locals => { :micropost => micropost } %>
</div>
<div id='comments'>
  <% comments = micropost.comments.paginate(:per_page => 5, :page => params[:page]) %>
  <%= render comments %>
  <%= will_paginate comments, :class =>"pagination" %>
</div>
</div>

Пользовательский контроллер для страницы показа

  def show
    @user = User.find(params[:id])
    @comment = Comment.find(params[:id])
    @micropost = Micropost.new
    @comment = Comment.new
    @comment = @micropost.comments.build(params[:comment])
    @comments = @micropost.comments.paginate(:page => params[:page], :per_page => 5)
    @microposts = @user.microposts.order('created_at DESC').paginate(:per_page => 10, :page => params[:page])
      respond_to do |format|
      format.html
      format.js
     end
  end

1 Ответ

8 голосов
/ 05 марта 2012

Проблема заключается в том, что will_paginate создает URL-адреса для каждой страницы (это не имеет никакого отношения к jQuery).

По своей воле will_paginate старается угадать базовый URL-адрес пользователя страницы.включен (внутренне он использует контроллер / действие для этого).Затем этот базовый URL объединяется с любыми дополнительными параметрами, передаваемыми помощнику will_paginate с использованием :params и последовательных номеров страниц.

На данный момент (will_paginate 3.0.3), чтобы перезаписать это поведение по умолчанию, необходимо написатьВаш пользовательский класс LinkRenderer.Ниже приведен пример такого класса - он использует новую дополнительную опцию :base_link_url, которую можно передать помощнику вида will_paginate.Переданная строка затем используется в качестве базы при создании ссылок на страницы.Если опция :base_link_url не пропущена, она вернется к поведению по умолчанию.

Поместите следующий класс туда, где rails может найти его при загрузке (например, / lib, если вы добавили / lib в пути автозагрузки вapplication.rb):

# custom_link_renderer.rb
class CustomLinkRenderer < WillPaginate::ActionView::LinkRenderer
  def prepare(collection, options, template)
    @base_link_url = options.delete :base_link_url
    @base_link_url_has_qs = @base_link_url.index('?') != nil if @base_link_url
    super
  end

  protected
  def url(page)
    if @base_link_url.blank?
      super
    else
      @base_url_params ||= begin
        merge_optional_params(default_url_params)
      end

      url_params = @base_url_params.dup
      add_current_page_param(url_params, page)

      query_s = []
      url_params.each_pair {|key,val| query_s.push("#{key}=#{val}")}

      if query_s.size > 0
        @base_link_url+(@base_link_url_has_qs ? '&' : '?')+query_s.join('&')
      else
        @base_link_url
      end
    end
  end
end

Использование:

# in your view
will_paginate collection, :renderer => CustomLinkRenderer, :base_link_url => '/anything/you/want'

А теперь вернемся к вашему делу.К этому времени вы, вероятно, увидите решение - вы можете иметь два виджета will_paginate на одной странице с разными базовыми URL, передавая различные опции :base_link_url для этих двух.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...