使用 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/title
和 channel/itunes:summary
就更好了。我希望这是可能的并且有意义。
你真的不需要 Nokogiri。只需使用 Ruby 标准库附带的 RSS module。
关于您的问题,您似乎想用来自 RSS 提要的信息填充 ActiveRecord
模型。最简单的方法(尤其是如果您不打算对应用程序中的任何其他数据执行此操作)是让控制器调用 RSS 并将数据映射到那里的 Series
和 Episode
模型。如果你这样做会更干净(也更容易测试)
创建可以获取 RSS 数据并从频道数据生成 Series
并从项目数据生成 Episodes
的特殊对象。
下一步是将 RSS 视为另一种数据存储形式(很像 SQLite 或 MySQL 数据库),并创建一个可以与 RSS end-point 交互的代码层和通过类似于 ActiveRecord
的界面(当然是 read-only)生成一个映射模型(在你的例子中说 RSSSeries
和 RSSEpisodes
)。然后可以使用控制器获取 RSSSeries
和访问相关的 RSSEpisodes
将其转换为 ActiveRecord
Series
和 Episodes
模型并保存它们。
我正在构建我的第一个 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/title
和 channel/itunes:summary
就更好了。我希望这是可能的并且有意义。
你真的不需要 Nokogiri。只需使用 Ruby 标准库附带的 RSS module。
关于您的问题,您似乎想用来自 RSS 提要的信息填充 ActiveRecord
模型。最简单的方法(尤其是如果您不打算对应用程序中的任何其他数据执行此操作)是让控制器调用 RSS 并将数据映射到那里的 Series
和 Episode
模型。如果你这样做会更干净(也更容易测试)
创建可以获取 RSS 数据并从频道数据生成 Series
并从项目数据生成 Episodes
的特殊对象。
下一步是将 RSS 视为另一种数据存储形式(很像 SQLite 或 MySQL 数据库),并创建一个可以与 RSS end-point 交互的代码层和通过类似于 ActiveRecord
的界面(当然是 read-only)生成一个映射模型(在你的例子中说 RSSSeries
和 RSSEpisodes
)。然后可以使用控制器获取 RSSSeries
和访问相关的 RSSEpisodes
将其转换为 ActiveRecord
Series
和 Episodes
模型并保存它们。