xml_controller.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:4k
源码类别:

Ajax

开发平台:

Others

  1. class XmlController < ApplicationController
  2.   caches_page :feed, :if => Proc.new {|c|
  3.     c.request.query_string == ''
  4.   }
  5.   NORMALIZED_FORMAT_FOR = {'atom' => 'atom', 'rss' => 'rss',
  6.     'atom10' => 'atom', 'atom03' => 'atom', 'rss20' => 'rss',
  7.     'googlesitemap' => 'googlesitemap', 'rsd' => 'rsd' }
  8.   CONTENT_TYPE_FOR = { 'rss' => 'application/xml',
  9.     'atom' => 'application/atom+xml',
  10.     'googlesitemap' => 'application/xml' }
  11.   before_filter :adjust_format
  12.   def feed
  13.     @format = params[:format]
  14.     unless @format
  15.       return render(:text => 'Unsupported format', :status => 404)
  16.     end
  17.     case params[:type]
  18.     when 'feed'
  19.       redirect_to :controller => 'articles', :action => 'index', :format => @format, :status => 301
  20.     when 'comments'
  21.       head :moved_permanently, :location => admin_comments_url(:format => @format)
  22.     when 'article'
  23.       head :moved_permanently, :location => Article.find(params[:id]).permalink_by_format(@format)
  24.     when 'category', 'tag', 'author'
  25.       head :moved_permanently, 
  26.         :location => self.send("#{params[:type]}_url", params[:id], :format => @format)
  27.     else
  28.       @items = Array.new
  29.       @blog = this_blog
  30.       # We use @feed_title.<< to destructively modify @feed_title, below, so
  31.       # make sure we have our own copy to modify.
  32.       @feed_title = this_blog.blog_name.dup
  33.       @link = this_blog.base_url
  34.       @self_url = url_for(params)
  35.       if respond_to?("prep_#{params[:type]}")
  36.         self.send("prep_#{params[:type]}")
  37.       else
  38.         render :text => 'Unsupported action', :status => 404
  39.         return
  40.       end
  41.       # TODO: Use templates from articles controller.
  42.       respond_to do |format|
  43.         format.googlesitemap
  44.         format.atom
  45.         format.rss
  46.       end
  47.     end
  48.   end
  49.   def articlerss
  50.     redirect_to :action => 'feed', :format => 'rss', :type => 'article', :id => params[:id]
  51.   end
  52.   def commentrss
  53.     redirect_to :action => 'feed', :format => 'rss', :type => 'comments'
  54.   end
  55.   def trackbackrss
  56.     redirect_to :action => 'feed', :format => 'rss', :type => 'trackbacks'
  57.   end
  58.   def rsd
  59.   end
  60.   protected
  61.   def adjust_format
  62.     if params[:format]
  63.       params[:format] = NORMALIZED_FORMAT_FOR[params[:format]]
  64.     else
  65.       params[:format] = 'rss'
  66.     end
  67.     return true
  68.   end
  69.   def fetch_items(association, order='published_at DESC', limit=nil)
  70.     if association.instance_of?(Symbol)
  71.       association = association.to_s.singularize.classify.constantize
  72.     end
  73.     limit ||= this_blog.limit_rss_display
  74.     @items += association.find_already_published(:all, :limit => limit, :order => order)
  75.   end
  76.   def prep_feed
  77.     fetch_items(:articles)
  78.   end
  79.   def prep_comments
  80.     fetch_items(:comments)
  81.     @feed_title << " comments"
  82.   end
  83.   def prep_trackbacks
  84.     fetch_items(:trackbacks)
  85.     @feed_title << " trackbacks"
  86.   end
  87.   def prep_article
  88.     article = this_blog.articles.find(params[:id])
  89.     fetch_items(article.comments, 'published_at DESC', 25)
  90.     @items.unshift(article)
  91.     @feed_title << ": #{article.title}"
  92.     @link = article.permalink_url
  93.   end
  94.   def prep_category
  95.     category = Category.find_by_permalink(params[:id])
  96.     fetch_items(category.articles)
  97.     @feed_title << ": Category #{category.name}"
  98.     @link = category.permalink_url
  99.   end
  100.   def prep_tag
  101.     tag = Tag.find_by_name(params[:id])
  102.     fetch_items(tag.articles)
  103.     @feed_title << ": Tag #{tag.display_name}"
  104.     @link = tag.permalink_url
  105.   end
  106.   def prep_sitemap
  107.     fetch_items(:articles, 'created_at DESC', 1000)
  108.     fetch_items(:pages, 'created_at DESC', 1000)
  109.     @items += Category.find_all_with_article_counters(1000) unless this_blog.index_categories == false
  110.     @items += Tag.find_all_with_article_counters(1000) unless this_blog.index_tags == false
  111.   end
  112. end