2009-11-04 4 views
1

J'ai une fonction de blog dans mon application rails. À l'heure actuelle je n'ai que 4 blogueurs sur le site et un (assez insatisfait) façon de les acheminer comme ceci:RESTful Archivage dans Rails

map.scarlet '/scarlet.:format', :controller => 'blogs', :action => 'show', :id => 'scarlet' 
map.alba '/andreasweinas.:format', :controller => 'blogs', :action => 'show', :id => 'alba' 

Alors qu'ils sont bien accessibles en tapant: mysuperwebsite.com/scarlet

Maintenant, je souhaite fournir des archives pour les blogs accessibles comme ceci:

mysuperwebsite.com/scarlet/2009 - affiche toutes les entrées de 2009

mysuperwebsite.com/scarlet/2009/06 - montre toutes les entrées de juin 2009

Quelqu'un pourrait-il recommander comment a) améliorer le routage de mon blog en ayant à l'esprit qu'à l'avenir j'aurai plus de blogueurs, et b) comment acheminer les archives sans rompre les chemins? Je pense à un contrôleur d'archives?

Modèles:

# Blog.rb 
class Blog < ActiveRecord::Base 
    has_many :entries, :dependent => :destroy 
    belongs_to :user 
end 

class Entry < ActiveRecord::Base 
    named_scope :published, :conditions => ["published_at < ?", Time.zone.now], :order => 'published_at DESC' 
    belongs_to :blog 
end 

Controller Blog:

def show 
    @blog = Blog.find_by_slug(params[:id]) 
    @entries = @blog.entries.published, :order => 'published_at DESC' 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @blog.entries } 
     format.rss 
    end 
    end 

Répondre

1

Ce n'est pas testé, mais devrait être très proche. Pas la solution la plus sèche, mais vous pouvez la refactoriser. Cela fera fonctionner le filtre de date ET vous permettra d'avoir de nouveaux blogs et de prendre en charge les routes existantes. Profitez

routes.rb

#(you don't need the .format) bit 
# (if you have other routes, like /help, you need to have them before these, since these match /*, /\*/\*, and /\*/\*/\* 

map.blogs '/:id/:year/:month', :controller => 'blogs', :action => 'show' 
map.blogs '/:id/:year', :controller => 'blogs', :action => 'show' 
map.blogs '/:id.:format', :controller => 'blogs', :action => 'show' 

contrôleur Blogs:

def show 
    @blog = Blog.find_by_slug(params[:id]) 

    if (params[:year]) 
     if (!params[:month]) 
      date_begin = Date.new(params[:year],1,1) 
      date_end = Date.new(params[:year],12,31) 
      date_end = Time.zone.now if date_end < Time.zone.now # to prevent grabbing future posts 
      @entries = Entries.find(:conditions => [blog => @blog, :published_at => date_begin..date_end ], 
       :order => 'published_at DESC' 
     else 
      date_begin = Date.new(params[:year],params[:month],1) 
      date_end = date_being.end_of_month 
      date_end = Time.zone.now if date_end < Time.zone.now # to prevent grabbing future posts 
      @entries = Entries.find(:conditions => [blog => @blog, :published_at => date_begin..date_end ], 
       :order => 'published_at DESC' 
     end 
    else 
     @blog.entries.published, :order => 'published_at DESC' 
    end 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @entries }   # I changed this too 
     format.rss 
    end 
    end 
Questions connexes