Должен ли я использовать 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 в отдельном приложении или, по крайней мере, в отдельном потоке и сохраните полученные каналы в таблице базы данных для быстрого доступа.

Другие вопросы по тегам