在Rails中,为什么保存新记录的回报为零,没有任何东西得到保存?

时间:2012-01-04 17:31:07

标签: ruby-on-rails ruby-on-rails-3

我使用

初始化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

#<AdUnit id: nil, dfp_id: "22319511", parent_id_dfp: "22261791", parent_id_bulk: nil, name: "second56", description: nil, target_window: "BLANK", explicitly_targeted: false, created_at: nil, updated_at: nil>

此时,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

2 个答案:

答案 0 :(得分:4)

好的,这是由AdUnit与AdUnitSize有accepts_nested_attributes_for关系时has_and_belongs_to_many的使用造成的。所以我得知这两个不能很好地协同工作。

唯一的问题是,在某个地方发出警告可能会很好,而不必从.savevalid? = true对象上返回nil而不是真或假来查找它。

答案 1 :(得分:2)

如果记录无效,则使用save!会引发异常。它没有返回任何东西。

如果您需要返回值,请仅使用save

基本上如果save!没有加注,记录会成功保存。如果你没有看到它,那么你可能错误地加载它。