0

我正在使用 Ruby Feedzirra gem 并设法通过在控制器中使用它来实现我的目标。

尽管我所看到的一切都提到在模型中使用它。我只是想知道在控制器中是否可以这样做,如果不是,我该如何在模型中实现相同的效果?

我想提交一个 Feed URL 并使用它来更新我的模型,其中包含有关该 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

饲料.rb

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

2 回答 2

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 请求可能效果不佳)

于 2013-05-25T06:08:27.473 回答
0

您真的不想在控制器中使用 RSS 解析器之类的东西。这将减慢该 URL 和您的服务器的响应速度。

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

于 2013-05-25T00:00:11.447 回答