1

배경 : 레일 앱에서 feedzirra plugin으로 놀고 있는데, 단일 피드에서 피드와 입구 접근자를 모두 활용하려고합니다. 전망.두 모델을 관련시키고 레일에서 단일 컨트롤러를 사용하여 액세스하기

이렇게하려면 두 가지 모델, 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 

의도 cron 작업으로 Feed.update_from_feed (FEED_URL)를 호출하는 것입니다. 실제로, 나는 cron 작업을 여러 피드를 전달하여이 함수를 호출하도록하고 싶습니다. 하지만 먼저 일하는 사람을 얻는다고 생각했습니다. 테스트를 위해 현재 콘솔에서이 함수를 호출하고 있습니다.

질문 : 이것은 매우 간단한 것처럼 보일 수 있습니다

NoMethodError: undefined method `id' for #<Feedzirra::Parser::RSS:0x00000100bcb0f0> 
  1. 는하지만, update_from_feed 함수를 호출에, 내 콘솔에서 위의 오류가 발생합니다. 루비와 레일에 익숙하지 않은 나는 테이블의 모든 새로운 엔트리가이 시나리오에서 feed.id에 의해 참조 될 수있는 ID가 주어 졌다는 인상을 받았다. 내가 여기서 뭔가를 놓치고 있니?

  2. 이 플러그인을 사용하는 좋은 방법은 제 2 모델 방식입니까? 질문 1을 해결할 때까지 나머지 접근 방법을 확인할 수 없으므로 평균 시간 내에 모범 사례에 대한 팁을 요청할 것입니다.

  3. 나머지 계획은 플러그인의 피드 및 엔트리 액세서를 단일 컨트롤러 내에서 활용 한 다음 상대 변수보기 내에서 이러한 변수를 어떻게 든 참조하는 것입니다. 이것이 내가 MVC 아키텍처를 인식하고 RESTful 방식으로 사용해야하는 방법입니까? 그렇다면 FeedReader 뷰에서 피드 및 액세스 접근자를 어떻게 참조합니까? 나는이 게시물의 나쁜 있었는지

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

    하지만 어떤 도움이 정말 감사하겠습니다 :

이 같은 피드 리더 컨트롤러가 보일 것이다 것입니다.

+0

1. 나는 바보 였고 내 피드 마이그레이션을 엉망으로 만든 다음주의를 기울이지 않았다! – anxiety

답변

1

접근 방식에는 몇 가지 결함이 있습니다.

첫 번째로 피드를 업데이트하면 존재하는지 (위대한) 여부를 확인한 다음 그럴 가능성을 다루지 않고 새 피드를 수집하려고 시도합니다. 당신은 다음과 같은 것이 필요합니다.

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 

귀하의 모든 질문에 답변하지는 못했지만 잘하면 시작입니다.

관련 문제