Paginación acts_as_taggable_on_steroids + will_paginate
Posted by vigosan, Mon Feb 25 12:23:00 UTC 2008
En un proyecto, estamos usando un par de plugins bastante conocidos, uno es will_paginate y el otro acts_as_taggable_on_steroids. Para ponernos en ejemplo, queremos obtener una lista de artículos paginados de 10 en 10, lo podemos hacer con:
@articles = Article.paginate(:all, :per_page => 10, :page => params[:page])
Por otra parte, podemos marcar nuestros artículos con una o varias etiquetas, tags:
# modelo
class Article < ActiveRecord::Base
acts_as_taggable
validates_presence_of :title, :body
end
# controlador
def create
@article = Article.new(params[:article])
@article.tag_list = params[:tag_list]
respond_to do |format|
if @article.save
flash[:notice] = 'Article was successfully created.'
format.html { redirect_to article_url(@article) }
else
format.html { render :action => "new" }
end
end
end
# formulario
<p>
<b>Title</b><br />
<%= f.text_field :title %>
</p>
<p>
<b>Body</b><br />
<%= f.text_area :body %>
</p>
<p>
<b><%= _("Tags") %></b><br />
<%= text_field_tag :tag_list, @article.tags.collect{|t| t.name}.join(" ") %>
</p>
Y en la vista mostrar una nube de etiquetas o tags:
<div id="sidebar">
<h2>Tags</h2>
<% tag_cloud @tags, %w(css1 css2 css3 css4) do |tag, css_class| %>
<%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %>
<% end %>
</div>
Y lo que pretendemos es que cuando se pulse en una de las etiquetas, se muestren sólo los artículos perteneciente a ellas. Aquí es donde combinamos los dos plugins:
# controlador
def tag
@articles = Article.paginate_by_id(Article.find_tagged_with(params[:id]), :page => params[:page])
respond_to do |format|
format.html { render :action => :index }
format.xml { render :xml => @articles.to_xml }
end
end