无法将记录保存到数据库RAILS嵌套表单

时间:2015-11-03 06:17:46

标签: ruby-on-rails sqlite activerecord nested-forms

我似乎无法用嵌套表单保存我的记录。

这就是pry所说的:

pry(#<VenuesController>)> @venue.save
   (0.3ms)  begin transaction
  Tag Exists (0.2ms)  SELECT  1 AS one FROM "tags" WHERE ("tags"."name" = 'All ' AND "tags"."id" != 2) LIMIT 1
  Tag Exists (0.1ms)  SELECT  1 AS one FROM "tags" WHERE "tags"."name" = '' LIMIT 1
   (0.1ms)  rollback transaction
=> false

我以为我正确地遵循了一切。 这是我的标签嵌套表单

Tags:
    <%= f.collection_check_boxes :tag_ids, Tag.all, :id, :name %><br>

  Make a New Tag Here: <br>

   <%= f.fields_for :tags, Tag.new do |tag_field| %>
    <%= tag_field.label :name_tag %>
    <%= tag_field.text_field :name %>
    <% end %>

这是我的场地模型

class Venue < ActiveRecord::Base
  has_many :venue_tags
  has_many :tags, :through => :venue_tags

  accepts_nested_attributes_for :tags, allow_destroy: true
end

我的标签模型

class Tag < ActiveRecord::Base
  has_many :venue_tags
  has_many :venues, :through => :venue_tags

  validates_uniqueness_of :name
end

然而,当取消'验证名称的唯一性'时,我可以保存它,但是新标签会自动添加。

这是pry日志,它告诉它是真的,但现在我正在添加到场地的正确标签,但是还添加了一个新的标签(我没有创建自己的标签)。我假设发生了这种情况,因为New Tag Fields_for文本是空白的,它自己创建了一个新标记。

(0.2ms)  begin transaction
  SQL (0.6ms)  INSERT INTO "venues" ("name", "address", "discount", "latitude", "longitude", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?)  [["name", "SPICEBOX"], ["address", "33 Pell St, New York, NY 10013, United States"], ["discount", "10% OFF with Student ID"], ["latitude", 40.714831], ["longitude", -73.998628], ["created_at", "2015-11-03 06:12:52.400643"], ["updated_at", "2015-11-03 06:12:52.400643"]]
  SQL (0.2ms)  INSERT INTO "venue_tags" ("tag_id", "venue_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["tag_id", 2], ["venue_id", 11], ["created_at", "2015-11-03 06:12:52.404715"], ["updated_at", "2015-11-03 06:12:52.404715"]]
  SQL (0.2ms)  INSERT INTO "tags" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", ""], ["created_at", "2015-11-03 06:12:52.408821"], ["updated_at", "2015-11-03 06:12:52.408821"]]
  SQL (0.1ms)  INSERT INTO "venue_tags" ("venue_id", "tag_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["venue_id", 11], ["tag_id", 9], ["created_at", "2015-11-03 06:12:52.411692"], ["updated_at", "2015-11-03 06:12:52.411692"]]
   (1.4ms)  commit transaction
=> true

2 个答案:

答案 0 :(得分:1)

您可能应该在标记名称中添加验证:在线状态。您似乎在数据库中有一个没有名称的标记,当您添加另一个没有名称的标记时,它不是唯一的,也不会通过验证。

查看表单或强参数,了解该值的清除方式(如果是)。

如果它是空白的,因为它是故意以这种方式提交的,那么如果空白则可以忽略它。

accepts_nested_attributes_for :tags, allow_destroy: true, :reject_if => lambda { |a| a[:name].blank? }

答案 1 :(得分:0)

  

然而,当取消名称&#39;的验证唯一性时,我可以保存   它

检查数据库中的名称,看看它是否已存在。 由于您可以保存记录,因此您的代码可能没问题。

要查看记录为什么不想保存,您可以询问您要保存的对象的错误。你可以在pry控制台中执行此操作。

@venue.save
...
=> false

@venue.errors.messages
=> ...

它可能会告诉您已经有一个同名的记录。如果情况确实如此,那么你的记录就不会有意义。