【问题标题】:rails fields_for parent id not being set on child modelrails fields_for parent id 未在子模型上设置
【发布时间】:2012-09-10 07:24:14
【问题描述】:

我一直在研究NestedAttributesFormHelper 的rails api 文档并搜索stackoverflow。

我的 new.html.haml 视图中有以下代码:

=form_for listing, :html => {:id => :listing_form, :multipart => :true} do |f|
    =f.fields_for :main_picture, (listing.main_picture || listing.build_main_picture) do |fmp|
            =fmp.hidden_field :main, :value => 1
            =fmp.file_field :image, :class => :picture_select

以及我的控制器中的以下代码:

  def create
    @listing = Listing.new(params[:listing])

    @listing.save ? redirect_to(:root) : render('listings/new')
  end

这是我的listing.rb:

class Listing < ActiveRecord::Base
  has_one :main_picture, :class_name => "Picture", :conditions => {:main => true}
  attr_accessible :main_picture_attributes
  accepts_nested_attributes_for :main_picture, :allow_destroy => true
end

还有我的图片.rb:

class Picture < ActiveRecord::Base
  belongs_to :listing
  validates_presence_of :listing
  attr_accessible :listing, :main
end

当我尝试提交表单时收到以下错误消息:

main_picture.listing: can't be blank

我无法弄清楚为什么框架没有自动将 main_picture(对象图片)的 listing_id 字段设置为父列表对象的 id 值。

是不是我做错了什么?

【问题讨论】:

    标签: ruby-on-rails callback fields-for


    【解决方案1】:

    您需要validates_presence_of :listing 吗?我怀疑子记录是在父对象之前创建的,所以它还没有 ID。

    删除该行并将:dependent =&gt; :destroy 添加到您的has_one :main_picture 将确保您不会得到孤立的图片记录。

    或者,重写你的控制器:

    p = params[:listing]
    @listing = Listing.new(p)
    @picture = Picture.new(p.delete(:main_picture).merge({:listing => @listing})
    
    etc.
    

    【讨论】:

    • 这也是我认为正在发生的事情。 NestedAttributes 链接仅表示子模型与父模型“保存在同一事务中”。但是在创建和验证父级之前先保存子级是没有意义的。我会尝试你的建议,看看它是否会改变这种情况。
    • 您的建议已阻止错误出现,据我所知,一切都按预期运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多