是否可以从一个控制器传递参数,以创建另一个控制器的项目?

时间:2016-01-10 00:49:38

标签: ruby-on-rails ruby

我是Rails的新手,我只通过标准form_for视图界面创建了项目。但我想以某种方式通过控制器制作物品。我有一个Subscription模型,它有一个参数:url。当我创建Subscription项时,我希望它根据该网址的RSS内容将信息委托给其他两个模型ShowEpisode

以下是我认为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,但我不知道究竟是怎么回事。我感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

你的方法很好用。 @subscription.show.build@subscription.episode.build仅有用且可用 IF 您的Subscription模型具有以下关联:

class Subscription < ActiveRecord::Base
  ...

  has_one :episode
  has_one :subscription

  ...
end

由于您不希望剧集或节目与订阅相关联,因此您不应使用build方法。 “入门指南”使用嵌套表单,因为commentsarticles相关联。创建comment时,嵌套表单会自动传递id的{​​{1}},从而可以更轻松地在articlearticles之间创建关联。因此,您也不需要嵌套表单。

我会对您的代码进行一些修改。您已经创建了一个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视图,则无法访问节目和剧集。我不确定您是否要保存模型,但如果您确实要保存它们,请发表评论,我会相应地更新我的答案。