在rails中嵌套模型中上传文件的表单

时间:2012-08-04 19:01:09

标签: ruby-on-rails ruby-on-rails-3.2 nested-forms carrierwave nested-attributes

我的目标是实现一对多 - >一对多结构,如rails api here中描述的结构:

class Document < ActiveRecord::Base
  has_many :sections
  has_many :paragraphs, :through => :sections
end

class Section < ActiveRecord::Base
  belongs_to :document
  has_many :paragraphs
end

class Paragraph < ActiveRecord::Base
  belongs_to :section
end

我正试图让段落类通过carrierwave上传文件,如the railscast主题within a nested AJAX form that lets me add and remove sections and paragraphs中所述。

由于我只在完整文档中查看图片,因此我尝试将代码保存在Document控制器中。所以,现在,控制器有:

  def show
    @document = Document.find_by_username(params[:documentname])
    @section = @document.sections
#   @paragraph = @section.paragraphs #DONT UNDERSTAND WHY UNCOMMENTING THIS DOESNT WORK.
  end

我的文档和剖面模型都设置了accepts_nested_attributes_for。但是,当我加载文档视图时,如果我取消注释上面的@paragraph,我会收到一个错误,表明部分分配成功,但由于缺少方法,段落分配不成功:

NoMethodError in DocumentController#show
undefined method `paragraph' for #<ActiveRecord::Relation:0x007f9b6409c340>

如果我发表评论,它似乎可以加载部分分配。目前,我的部分和段落表是完全空白的,因为我无法设置表单,所以这可能是问题的一部分。但我认为nil会给我一个不同于没有方法的错误,对吧?所以,我怀疑已经出现了问题。

所以,我的主要困惑在于:如何以及在何处构建由我的文档控制器控制的表单以接受任何数据,然后特别是使用carrierwave文件上载?

如果你对如何更好地构建这个有任何其他建议,我会很感激。

另外,调试它的好方法是什么?我似乎错过了一个方法,哪一个,哪里?

我引用了这些,但无法找到解决方案:

更新1

我怀疑问题是来自我糟糕的节目命令?它不能将正确的部分多重索引到正确的段落?所以,

  def show
    @document = Document.find_by_username(params[:documentname])
    @section = @document.sections
#   @paragraph = @section.paragraphs #DONT UNDERSTAND WHY UNCOMMENTING THIS DOESNT WORK.
  end

应该更像:

  def show
    @document = Document.find_by_username(params[:documentname])
    @section = @document.sections
    @paragraph = @section.find(params[:section_id]).paragraphs
  end

这不起作用,但是那样的东西?有一种方法似乎没有将各部分链接到各个段落。我得到的错误是:

ActiveRecord::RecordNotFound in DocumentController#show

Couldn't find Section without an ID

更新2

也许这意味着我应该伸缩所有的show命令?也就是说,获得正确部分的正确段落将更加如此:

在文档控制器中:

def show
    @document = Document.find_by_username(params[:documentname])
    @section = @document.sections
end
节控制器中的

def show
    @section = Section.find(params[:id])
    @paragraph = @section.pictures
end

那么,如果是这种情况,我该如何设置嵌套表单?要在文档#show page中的turcasts风格的ajax界面中共同创建(1)部分,(2)段落和(3)图像?

3 个答案:

答案 0 :(得分:0)

你试过吗?

  @section = @document.sections.build
  @paragraph = @sections.paragraphs.build

答案 1 :(得分:0)

我搜索过的所有SO答案都没有为我工作,因为上传时初始密钥不存在,因此无法链接到它。

所以,我的解决方案就是不尝试这种设计。使用较少的嵌套来制作不同的形式。

答案 2 :(得分:0)

我在另一篇文章中写了一个很大的答案,其中概述了如何使用Carrierwave,jQuery File Uploader和嵌套模型在Rails中进行多文件上传。也许它会有所帮助?

Rails 3 + JQuery-File-Upload + Nested Model