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

Filed Under: Rails | Tags:

Comments