在Rails中,为什么保存新记录会返回nil,而没有任何东西得到保存?
我初始化一个AdUnit对象au
au = AdUnit.new(cp)
其中cp
等于:
{:name=>"second56", :description=>nil, :target_window=>"BLANK", :explicitly_targeted=>false, :ad_unit_sizes_attributes=>[{:height=>90, :width=>728, :is_aspect_ratio=>false, :environment_type=>"BROWSER"}], :dfp_id=>"22319511", :parent_id_dfp=>"22261791"}
并且产生的对象au
是
#
此时, au.valid?
和au.new_record?
两者都归实为true
。
如果我执行au.save
(或au.save!
),结果为nil
并且没有任何内容保存到数据库中。 但如果我这样做
aud = au.dup aud.save
结果为true
并保存记录。
我可以使用重复的解决方法保存我的对象,但这对我来说看起来很奇怪。 任何人都可以提出任何想法,为什么会发生这种情况? 来自Rails控制台的2个保存语句的SQL片段下面。
在此先感谢所有Rails大师。
返回nil
而不保存:
SQL (1.0ms) INSERT INTO "ad_units" ("created_at", "description", "dfp_id", "explicitly_targeted", "name", "parent_id_bulk", "parent_id_dfp", "target_window", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) [["created_at", Wed, 04 Jan 2012 17:28:37 UTC +00:00], ["description", nil], ["dfp_id", "22400631"], ["explicitly_targeted", false], ["name", "zapiFirstLevel366"], ["parent_id_bulk", nil], ["parent_id_dfp", "1166751"], ["target_window", "BLANK"], ["updated_at", Wed, 04 Jan 2012 17:28:37 UTC +00:00]] => nil
返回true
并保存:
SQL (0.9ms) INSERT INTO "ad_units" ("created_at", "description", "dfp_id", "explicitly_targeted", "name", "parent_id_bulk", "parent_id_dfp", "target_window", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) [["created_at", Wed, 04 Jan 2012 17:29:58 UTC +00:00], ["description", nil], ["dfp_id", "22400631"], ["explicitly_targeted", false], ["name", "zapiFirstLevel366"], ["parent_id_bulk", nil], ["parent_id_dfp", "1166751"], ["target_window", "BLANK"], ["updated_at", Wed, 04 Jan 2012 17:29:58 UTC +00:00]] => true
好的,这是由于当AdUnit与AdUnitSize存在has_and_belongs_to_many
关系时使用accepts_nested_attributes_for
。 所以我得知这两个不能很好地协同工作。
唯一的问题是,在某个地方发出警告可能是件好事,而不是必须从.save
找到有关它的valid? = true
valid? = true
对象而不是true或false。
使用save!
如果记录无效,则引发exception。 它没有返回任何东西。
如果您需要返回值,请仅使用save
。
基本上如果save!
没有提高,记录成功保存。 如果你没有看到它,那么你可能错误地加载了它。