我的目标是实现一对多 - >一对多结构,如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文件上载?
如果你对如何更好地构建这个有任何其他建议,我会很感激。
另外,调试它的好方法是什么?我似乎错过了一个方法,哪一个,哪里?
我引用了这些,但无法找到解决方案:
我怀疑问题是来自我糟糕的节目命令?它不能将正确的部分多重索引到正确的段落?所以,
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
也许这意味着我应该伸缩所有的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)图像?
答案 0 :(得分:0)
你试过吗?
@section = @document.sections.build
@paragraph = @sections.paragraphs.build
答案 1 :(得分:0)
我搜索过的所有SO答案都没有为我工作,因为上传时初始密钥不存在,因此无法链接到它。
所以,我的解决方案就是不尝试这种设计。使用较少的嵌套来制作不同的形式。
答案 2 :(得分:0)
我在另一篇文章中写了一个很大的答案,其中概述了如何使用Carrierwave,jQuery File Uploader和嵌套模型在Rails中进行多文件上传。也许它会有所帮助?