2012-03-05 10 views
6

Actualmente tengo un modelo de comentarios que se publica debajo de un micropost y ambos se muestran en la misma página. El problema es que ambos se muestran en la misma página y ambos están paginados y estoy tratando de aplicar el enfoque de Facebook a la microposición. Aquí está el problema a continuación:Problema con los enlaces de la página will_paginate

Los enlaces para ambas paginación se convierten en este href="https://stackoverflow.com/users/2?page=2" en lugar de href="https://stackoverflow.com/users/2/micropost?page=2" o href="https://stackoverflow.com/users/2/comment?page=2". No estoy seguro de cómo resolver este problema. Aquí hay algunos de mis códigos. ¡Todas las sugerencias son muy apreciadas!

micropost representar 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> 

comentario Sección 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> 

del usuario del controlador para el espectáculo Página

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 

Respuesta

8

El problema se encuentra en la forma will_paginate de crear URL para cada página (no tiene nada que ver con jQuery).

Por diseño, will_paginate intentará adivinar cuál es la url base para el usuario de la página (internamente está usando el controlador/acción para hacerlo). Esa url base se combina con cualquier parámetro adicional pasado a will_paginate helper usando :params y números de página sucesivos.

Por ahora (will_paginate 3.0.3), para sobrescribir este comportamiento predeterminado, necesita escribir su clase LinkRenderer personalizada. A continuación hay un ejemplo de dicha clase: hace uso de la nueva opción adicional :base_link_url que se puede pasar a will_paginate view helper. La cadena pasada se usa como base al crear enlaces de paginación. Si no se pasa la opción :base_link_url, retrocederá al comportamiento predeterminado.

Coloca el siguiente clase alguna parte rieles pueden encontrar en carga (/ lib por ejemplo, siempre que se haya agregado/lib a sus trayectorias de carga automática en 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 

Uso:

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

Y ahora de vuelta a su caso. En este momento es probable que vea la solución: puede tener dos widgets will_paginate en una página con diferentes URL base al pasar diferentes opciones de :base_link_url para esos dos.

+0

Supongo que 'colección' ¿Lo reemplazo por lo que sea que deba ser paginado? Porque si no recibo un error indefinido – Kellogs

+0

, ¿también cómo agregaría el id del usuario en base_link_url? Debido a que estos dos enlaces no funcionan ': base_link_url =>"/users/<%= user.id%> ",' ': base_link_url =>"/users /: id ",' – Kellogs

+0

Sí, sustituya la 'colección' con cualquier otra variable que contenga elementos para ser paginado En cuanto a usar: opción base_link_url - no pase la cadena con algunos marcadores de posición como lo hace en routes.rb - simplemente pase el resultado del método url helper. Por ejemplo, si tiene una ruta con nombre "user_micropost" que está traducida a (por ejemplo) '/ user/2/micropost', entonces' user_micropost_path (: id => 2) 'sería la opción que necesita pasar como': base_link_url '. Todos los enlaces renderizados obtendrían url como:/user/2/micropost? Page = 1/user/2/micropost? Page = 2 y así sucesivamente. – WTK

Cuestiones relacionadas