2015-09-12 3 views
0

Я ищу, чтобы извлекать статьи из RSS через мое приложение rails. У меня есть веб-страница с кнопкой, которая выполняет очистку этих статей. Существует модель User и Article, и я определил контроллер для очистки этих статей. Этот контроллер скремблирования должен извлекать значения из RSS-канала и передавать значения в контроллер статьи.Контроль прохождения от одного контроллера к другому контроллеру

Я новичок в рельсах и не уверен, как выполнить эту операцию. Ниже приводится то, что я сделал до сих пор.

class ArticlesController < ApplicationController 
    def create 
    @article = Article.new(article_params) 
    @article.user = current_user 
    respond_to do |format| 
     if @article.save 
     format.html { redirect_to rss_importer_path } 
     format.json { render :show, status: :created, location: @article } 
     else 
     format.html { render :new } 
     format.json { render json: @article.errors, status: :unprocessable_entity } 
     end 
    end 
    end 


    private 
    def set_article 
     @article = Article.find(params[:id]) 
    end 

    def article_params 
     params.require(:article).permit(:author, :title, :summary, :url, :date, :image, :user_id) 
    end 
end 

class RssImportersController < ApplicationController 
    def scrape 
    url = 'http://tviview.abc.net.au/rss/category/abc1.xml' 
    open(url) do |rss| 
     feed = RSS::Parser.parse(rss) 
     feed.items.each do |item| 
     article_path(author => nil, title => item.title, summary => item.description, 
       source => item.link, date => item.pubDate, image => nil) 

     end 
    end 
    end 


end 

В routes.rb -

resources :rss_importers 

Это моя точка зрения -

<div class="btn-group pull-left" role="group"> 
    <%= link_to 'Scrape Articles', rss_importer_path ,class: "btn btn-default" %> 
</div> 
<br> <br> 

<h1>All Articles</h1> 

<% @articles.each do |article| %> 
<%= render partial: 'index_article', locals: {article: article} %> 
<% end %> 

ответ

0

Я бы рекомендовал не использовать контроллер для выполнения скрип. Вы можете создать класс обслуживания и просто вызвать это из контроллера статьи.

В приложении/услуги/rss_importer.rb:

class ImportRss 
    def call(params) 
    #Import code here 
    end 
end 

Затем в контроллере статьи:

def create 
    result = ImportRss.new.call(params) 
    #Rest of your codes 
end 

Вот хороший блог о том, как использовать классы обслуживания: http://adamniedzielski.github.io/blog/2014/11/25/my-take-on-services-in-rails/

+0

Кажется, это классный Том. Я искал царапины из нескольких RSS-каналов, а также json. Не могли бы вы рекомендовать мне подход к дизайну, если я последую за сервисным подходом? Я не уверен в этом в рельсах. – coder05

+0

Я не уверен, что смогу помочь с этим из-за ограниченного понимания того, что вы пытаетесь выполнить. Тем не менее, сообщение в блоге, которое я связал, было очень полезно для меня при разработке этих типов функций. В зависимости от того, что вы пытаетесь сделать и насколько усложняется каждый канал json feed/RSS, вы можете просто создать сервис для каждого, чтобы вы могли называть их независимо друг от друга. Вы также можете создать родительский класс для этих служб, который вызывает их всех или решает, какой из них вызывать на основе предоставленных параметров. –

+0

Не могу ли я объединить список статей внутри метода scrape и передать список статей для создания метода статьи, который сохраняет его в виде массива статей? В этом случае мне не нужен сервис. – coder05