我是Rails的新手,我只通过标准form_for
视图界面创建了项目。但我想以某种方式通过控制器制作物品。我有一个Subscription
模型,它有一个参数:url
。当我创建Subscription
项时,我希望它根据该网址的RSS内容将信息委托给其他两个模型Show
和Episode
。
以下是我认为Subscription
创建方法看起来像的一些伪代码:
def create
require 'rss'
require 'open-uri'
@subscription = Subscription.new(subscription_params)
if @subscription.save
@show = Show.new
@episode = Episode.new
url = @subscription.url
open(url) do |rss|
feed = RSS::Parser.parse(rss)
@show.title = feed.channel.title
feed.items.each do |item|
@episode.title = item.title
@episode.url = item.url
end
end
redirect_to @subscription
else
render 'new'
end
end
我执行了rails入门指南,并在form_for([@article, @article.comments.build])
/ has_many
关联中使用了belongs_to
(这两者都有)。所以我想我需要以某种方式使用@subscription.show.build
和@subscription.episode.build
,但我不知道究竟是怎么回事。我感谢任何帮助!
答案 0 :(得分:0)
你的方法很好用。 @subscription.show.build
和@subscription.episode.build
仅有用且可用 IF 您的Subscription
模型具有以下关联:
class Subscription < ActiveRecord::Base
...
has_one :episode
has_one :subscription
...
end
由于您不希望剧集或节目与订阅相关联,因此您不应使用build
方法。 “入门指南”使用嵌套表单,因为comments
与articles
相关联。创建comment
时,嵌套表单会自动传递id
的{{1}},从而可以更轻松地在article
和articles
之间创建关联。因此,您也不需要嵌套表单。
我会对您的代码进行一些修改。您已经创建了一个comments
,并且正在反复更改其属性,而不是创建多个Episode
。试试这个(我已经评论了代码中已更改的部分):
Episodes
我要注意的最后一件事是你没有保存你的模特。因此,在此控制器操作处理并且您被重定向到def create
require 'rss'
require 'open-uri'
@subscription = Subscription.new(subscription_params)
if @subscription.save
@show = Show.new
@episodes = []
url = @subscription.url
open(url) do |rss|
feed = RSS::Parser.parse(rss)
@show.title = feed.channel.title
feed.items.each do |item|
# ** START CHANGES **
episode = Episode.new(title: item.title, url: item.url)
@episodes.push(episode)
# ** END CHANGES **
end
end
redirect_to @subscription
else
render 'new'
end
end
视图后,如果您离开Subscription
视图,则无法访问节目和剧集。我不确定您是否要保存模型,但如果您确实要保存它们,请发表评论,我会相应地更新我的答案。