我正在玩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
答案 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解析器,并将检索到的提要存储在数据库表中以便快速访问。