Связь двух моделей и доступ к ним с помощью одного контроллера в Rails - PullRequest
1 голос
/ 15 августа 2010

Справочная информация: Я играю с плагином feedzirra в приложении rails, и я пытаюсь использовать как средства доступа к фиду, так и входные элементы проанализированного канала в одном представлении,

Для этого я создал две модели: feed и feed_entry.Они выглядят следующим образом:

feed.rb:

class Feed < ActiveRecord::Base
  attr_accessible :title, :url, :feed_url, :last_modified, :guid
  has_many :feed_entries

  def self.update_from_feed(feed_url)
    feed = Feedzirra::Feed.fetch_and_parse(feed_url)
    add_feed(feed)
    FeedEntry.add_entries(feed.entries)
  end


  private

  def self.add_feed(feed)
    unless exists? :guid => feed.id
      create!(
        :title          => feed.title,
        :url            => feed.url,
        :feed_url       => feed.feed_url,
        :last_modified  => feed.last_modified,
        :guid           => feed.id
      )
    end
  end
end

feed_entry.rb:

class FeedEntry < ActiveRecord::Base
  attr_accessible :title, :url, :author, :summary, :content, :published, :guid
  belongs_to :feed

  def self.add_entries(entries)
    entries.each do |entry|
      unless exists? :guid => entry.id
        create!(
          :title        => entry.title,
          :url          => entry.url,
          :author       => entry.author,
          :summary      => entry.summary,
          :content      => entry.content,
          :published    => entry.published,
          :guid         => entry.id
        )
      end
    end
  end
end

Где предполагается, что Feed.update_from_feed (feed_url) называетсяCron работа.На самом деле, я надеюсь, что задание cron вызовет эту функцию, передав несколько каналов;но я подумал, что сначала получу работу.В целях тестирования я сейчас вызываю эту функцию из консоли.

Вопросы:

NoMethodError: undefined method `id' for #<Feedzirra::Parser::RSS:0x00000100bcb0f0>
  1. Это может показаться очень простым, но при вызове функции update_from_feed я получаю вышеуказанную ошибку в своей консоли.Хотя я новичок в ruby ​​и rails, у меня сложилось впечатление, что каждой новой записи в таблице присваивается идентификатор, на который можно ссылаться - в этом сценарии - feed.id.Я что-то здесь упускаю?

  2. Является ли мой двухмодельный подход к использованию этого плагина хорошим направлением?Поскольку я не могу проверить, работает ли остальная часть моего подхода, пока я не разгадаю вопрос 1, я подумал, что попрошу дать совет по наилучшей практике за это время.

  3. Остальная часть моего плана - использовать средства доступа к входу и подаче плагина в одном контроллере, а затем как-то ссылаться на эти переменные в относительном представлении.Это то, как я должен воспринимать архитектуру MVC и использовать ее RESTful способом?Если да, то как мне ссылаться на средства доступа к каналу и записи в представлении FeedReader?

Вот как будет выглядеть контроллер FeedReader:

class FeedEntriesController < ApplicationController
  def index
    @feed_entries = FeedEntry.all
    @feeds = Feed.all
  end
end

Я знаюэто была сука поста, но любая помощь будет очень признательна.

1 Ответ

1 голос
/ 14 октября 2011

Есть несколько недостатков в вашем подходе.

Во-первых, когда вы обновляете свой фид, вы проверяете, существует ли (отлично) или нет, но затем не рассматриваете возможность того, что он существует, и затем вы все равно пытаетесь собрать новые фиды.Вам нужно что-то вроде:

feed = Feed.find_by_url(incoming_url) # try loading an existing feed first
feed = Feedzirra::Feed.fetch_and_parse(feed_url) if !feed # if not, create a new one

Предполагая, что последняя команда Feedzirra является той, которая создаст новый канал.Я не помню!

Идея двух моделей кажется разумным подходом.При последующем доступе к вашим каналам через контроллеры вам, вероятно, следует попробовать вложенные ресурсы.Тогда ваш URL будет выглядеть примерно так:

/feed/1/entries

А ваш контроллер будет выглядеть примерно так:

@feed = Feed.find(params[:feed_id])
@entries = @feed.entries

Я не ответил на все ваши вопросы, но, надеюсь, это начало.

...