holysugarの日記

2006-07-13

RSS::Maker  RSS::Maker - holysugarの日記 を含むブックマーク はてなブックマーク -  RSS::Maker - holysugarの日記

RSS::Maker って何気なく使ってたけど標準添付なんだよなぁ.

RailsでもRSS書くときは.rxmlとかコントローラRSS::Maker使用とかじゃなくて .rrss で RSS::Maker で書けるようにするとかはちょっとだけありかもとか思った.というかコントローラの中でRSS::Makerのためのコードが場所を取ってるのはなんだかなぁ

[]rrssテンプレート rrssテンプレート - holysugarの日記 を含むブックマーク はてなブックマーク - rrssテンプレート - holysugarの日記

というわけで書いてみた.

コントローラに書いてたのに比べればすっきりだけどその反面evalとかアレでソレ.

rss_template.rb:

require 'rss/maker'

module RssTemplate
  class Base
    cattr_accessor :default_content_type, :default_rss_version
    @@default_content_type = 'application/xml; charset=UTF-8'
    @@default_rss_version  = '1.0'

    def initialize(action_view)
      @action_view = action_view
    end

    def render(template, local_assignes = {})
      @action_view.controller.headers["Content-Type"] ||= @@default_content_type
      @action_view.controller.instance_eval {
        rss_version = @rss_version || RssTemplate::Base.default_rss_version
        RSS::Maker.make(rss_version) do |rss|
          eval template
        end
      }
    end
  end
end

あぁんもっと誰かがんばって.><。

evalしなくて済む方法とかあればおしえてください.

Pluginにしてないので現状はこんな感じに使う(適当すぎ).

environment.rb:

require_dependency 'rss_template'
ActionView::Base.register_template_handler "rrss", RssTemplate::Base

hoge_controller.rb

  def list
    @hoges = Hoge.find(:all)
  end

hoge/list.rrss

rss.channel.about = 'http://hoge.example.com/'
rss.channel.title = 'ほげリスト'
rss.channel.description = 'ほげのリストです'
rss.channel.link  = 'http://hoge.example.com/hoge/list'
@hoges.each do |hoge|
  item = rss.items.new_item
  item.title = hoge.title
  item.description = hoge.content
  item.link = url_for(...)
end