【问题标题】:Rails 3 accepts_nested_attributes_for form for new model (instead of full collection)Rails 3 接受新模型的_nested_attributes_for 表单(而不是完整集合)
【发布时间】:2011-03-04 14:49:39
【问题描述】:

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

我有一个带有表单的 RESTful 应用程序(在 formtastic 的帮助下),它可以像这样输出所有轨道的属性

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

表单列出了所有相关的曲目字段,我可以很好地更新它们,一切正常。

现在,我想做的是另一种观点,将新曲目添加到现有专辑中。在此视图中,我不想呈现现有轨道的所有输入字段,而只想呈现我正在尝试创建的单个新关联的字段。

我试图找到有关如何执行此操作的信息,我想出的最好的方法是:

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

这会根据需要输出一组跟踪输入,我可以提交表单,然后创建跟踪并将其关联到产品 - 但前提是没有验证错误。

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

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

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

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    代替

    Track.new
    

    你需要设置

    @track = @album.tracks.build
    

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

    【讨论】:

      【解决方案2】:

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

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

      显然只呈现新记录的表单字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多