使用 nokogiri 在源文档和每个项目之间创建关联

Creating an association between a source document and each item with nokogiri

我正在构建我的第一个 Web 应用程序,但有点不知所措。我已经阅读了 nokogiri 文档,并且知道我需要使用 Nokogiri::XML(open("http://foo")),但我不确定在哪里使用它才是正确的。

我有一个包含三列的 series 模型,:name:description:url。我想要它,所以当我创建一个新的 series 时,放置在 :url 表单字段中的 URL 被解析,并为提要中的每个项目创建一个 episode , 用 xpath 参数填充它的列。

这个逻辑会进入 series 模型或控制器吗?或者在 episodes 模型或控制器中?

这是我现在拥有的。

series 型号

class Series < ActiveRecord::Base
  validates :name, presence: true
  validates :description, presence: true
  validates :url, presence: true
  has_many :episodes, dependent: :destroy
end

series 控制器

class SeriesController < ApplicationController
  def index
    @series_all = Series.all
  end

  def show
    @series = Series.find(params[:id])
  end

  def new
    @series = Series.new
  end

  def edit
    @series = Series.find(params[:id])
  end

  def create
    @series = Series.new(series_params)

    if @series.save
      redirect_to @series
    else
      render 'new'
    end
  end

  def destroy
    @series = Series.find(params[:id])
    @series.destroy

    redirect_to series_path
  end

  private
    def series_params
      params.require(:series).permit(:name, :description, :url)
    end
end

routes.rb

Rails.application.routes.draw do
  resources :series do
    resources :episodes
  end
  root 'home#index'
end

series 形式部分

<%= form_for @series do |f| %>
  <div class="series-form">
    <div class="series-form__name">
      <%= f.label :name %>
      <%= f.text_field :name %>
    </div>

    <div class="series-form__description">
      <%= f.label :description %>
      <%= f.text_area :description %>
    </div>

    <div class="series-form__url">
      <%= f.label :url %>
      <%= f.text_field :url %>
    </div>

    <div class="series-form__submit">
      <%= f.submit %>
    </div>
  </div>
<% end %>

episodes 有一个空控制器,还没有模型。


编辑:澄清一下,我正在尝试导入播客。因此,以 The Stack Exchange Podcast 的 RSS feed 为例,我会将其置于 series 形式:

名称:Stack Exchange 播客(来自 channel/title

说明:由 Joel Spolsky 与 Jay Hanlon 和 David Fullerton 共同主持。 . . (来自 channel/itunes:summary

URL: https://blog.whosebug.com/feed/podcast/

并且它会为提要中的每个 item 创建一个 episode。如果我能自动抓取 channel/titlechannel/itunes:summary 就更好了。我希望这是可能的并且有意义。

你真的不需要 Nokogiri。只需使用 Ruby 标准库附带的 RSS module

关于您的问题,您似乎想用来自 RSS 提要的信息填充 ActiveRecord 模型。最简单的方法(尤其是如果您不打算对应用程序中的任何其他数据执行此操作)是让控制器调用 RSS 并将数据映射到那里的 SeriesEpisode 模型。如果你这样做会更干净(也更容易测试) 创建可以获取 RSS 数据并从频道数据生成 Series 并从项目数据生成 Episodes 的特殊对象。

下一步是将 RSS 视为另一种数据存储形式(很像 SQLite 或 MySQL 数据库),并创建一个可以与 RSS end-point 交互的代码层和通过类似于 ActiveRecord 的界面(当然是 read-only)生成一个映射模型(在你的例子中说 RSSSeriesRSSEpisodes)。然后可以使用控制器获取 RSSSeries 和访问相关的 RSSEpisodes 将其转换为 ActiveRecord SeriesEpisodes 模型并保存它们。