我有一个模型相册,它有一个名为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错误消息。
我做错了什么?
答案 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
显然只会渲染新记录的表单字段。