Rails 3 accepted_nested_attributes_for表单用于新模型(而不是完整集合)

时间:2011-03-04 14:49:39

标签: ruby-on-rails nested-forms has-many-through formtastic

我有一个模型相册,它有一个名为Track的“has_many:trough”关联。基本上,专辑可以有多个曲目,但是曲目可以同时属于多个专辑(因此通过关联“Tracklist”)。

我有一个RESTful应用程序,带有一个表单(在formtastic的帮助下),它会显示所有轨道的属性,如此

form.semantic_fields_for :tracks do | builder |
    builder.fields
end

表单会显示所有相关的Tracks字段,我可以更新它们,一切正常。

现在,我想要做的是另一个视图,将新曲目添加到现有专辑中。在这个视图中,我不想渲染现有轨道的所有输入字段,而只想渲染我试图创建的单个新关联的字段。

我试图找到关于如何做到这一点的信息,我提出的最好的是:

form.semantic_fields_for :tracks, Track.new do | builder | 
    builder.fields
end

这会输出一组Track输入,如需要,我可以提交表单并创建跟踪并与产品相关联 - 但前提是没有验证错误。

问题来自验证。如果一个失败,应用程序再次呈现相同的视图,但所有输入都是空的(所有数据,有效或无效,丢失,并且Formtastic的内联错误消息也消失了):

 form.semantic_fields_for :tracks, Track.new do | builder | 
        builder.fields
 end

我认为这是因为我做了一个Track.new,即使请求参数中已经有一个包含数据和错误消息的对象。这当然不好。我想要的是使用已输入数据显示的单个轨道的表单,以及Formtastic错误消息。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

而不是

Track.new

你需要设置

@track = @album.tracks.build

在您的控制器中并使用它。这应该通过验证错误保留字段。

答案 1 :(得分:0)

我找到了解决方案。它有效,但我想知道它是否是一个很好的解决方案。谢谢Srdjan让我走上正轨!

@track = @album.tracks.build

form.semantic_fields_for :tracks, @track do | builder | 
   builder.fields if builder.object.new_record?
end

显然只会渲染新记录的表单字段。