我应该在模型中使用Feedzirra吗?

时间:2013-05-24 23:28:10

标签: ruby ruby-on-rails-3 rubygems feedzirra

我正在玩Ruby Feedzirra宝石,并设法通过在控制器中使用它来实现我的目的。

虽然我见过的所有内容都提到在模型中使用它。我只是想知道在控制器中是否可以这样做,如果没有,我怎样才能在模型中实现相同的目标呢?

我想提交一个Feed网址,并使用它来更新我的模型,其中包含有关Feed的其他信息。

Feeds_controller.rb

def create
  @feed = Feed.new(params[:feed])

  feed = Feedzirra::Feed.fetch_and_parse(@feed.feed_url)
  @feed.title         = feed.title
  @feed.url           = feed.url
  @feed.last_modified = feed.last_modified

  respond_to do |format|
    if @feed.save
      format.html { redirect_to @feed, notice: 'Feed was successfully created.' }
      format.json { render json: @feed, status: :created, location: @feed }
    else
      format.html { render action: "new" }
      format.json { render json: @feed.errors, status: :unprocessable_entity }
    end
  end
end

feed.rb

class Feed < ActiveRecord::Base
  attr_accessible :feed_url, :last_modified, :title, :url
end

2 个答案:

答案 0 :(得分:1)

我在模型上创建一个实例方法,并在控制器中使用它

class Feed < ActiveRecord::Base
   def fetch!
     feed = Feedzirra::Feed.fetch_and_parse(feed_url) # probably want some eror handling here
     title = feed.title
     url = feed.url
     last_modified = feed.last_modified
     self #or nil if you like
   end
end
然后你的控制器变薄了

def create
  @feed = Feed.new(params[:feed])
  @feed.fetch!

  respond_to do |format|
    if @feed.save
      format.html { redirect_to @feed, notice: 'Feed was successfully created.' }
      format.json { render json: @feed, status: :created, location: @feed }
    else
      format.html { render action: "new" }
      format.json { render json: @feed.errors, status: :unprocessable_entity }
    end
  end
end

这里很酷的事情是,如果速度太慢,你可以使用类似Resque之类的东西在后台运行,只需向用户返回“正在处理您的请求”消息,然后异步提醒它们当请求完成时(json请求可能效果不好)

答案 1 :(得分:0)

您真的不想在控制器中使用类似RSS解析器的东西。这会降低该URL和服务器的响应速度。

相反,在单独的应用程序或至少一个单独的线程中运行RSS解析器,并将检索到的提要存储在数据库表中以便快速访问。