Должен ли я использовать Feedzirra в модели?
Я играю с драгоценным камнем Ruby Feedzirra, и мне удалось добиться того, что я намеревался сделать, используя его в контроллере.
Хотя все, что я видел, упомянуло использование этого в модели. Мне просто интересно, нормально ли это делать в контроллере, если нет, как я могу добиться того же в модели?
Я хочу отправить URL-адрес фида и использовать его для обновления своей модели с помощью остальной информации о фиде.
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 ответа
Я сделал бы экземпляр метода на модели и использовал бы его в контроллере так
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)
Вы действительно не хотите использовать что-то вроде парсера RSS в вашем контроллере. Это замедлит скорость отклика этого URL и вашего сервера.
Вместо этого запустите анализатор RSS в отдельном приложении или, по крайней мере, в отдельном потоке и сохраните полученные каналы в таблице базы данных для быстрого доступа.