2015-11-03 3 views
0

Я не могу сохранить свою запись с вложенными формами.Невозможно сохранить запись в базу данных RAILS вложенные формы

Это то, что подглядывать говорит:

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 

ответ

1

Возможно, вы должны добавить подтверждение: наличие имени тега. Кажется, у вас есть тэг в вашем db, который не имеет имени, и когда вы добавляете другого без имени, он не уникален и не будет проходить проверки.

Посмотрите на форму или сильные параметры, чтобы увидеть, как это значение очищается, если оно есть.

Если оно пустое, потому что оно было преднамеренно представлено таким образом, вы можете игнорировать его, если оно пустое.

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

Удивительный! Это работает сейчас. Благодаря! – minlingzhao

0

Однако, когда Взлет «проверить уникальность имени», я могу спасти это

Проверьте базу данных для имени и посмотреть, если он уже существует. Поскольку вы можете сохранить запись, вы, вероятно, код.

Чтобы узнать, почему запись не хочет сохранять, вы можете узнать об ошибках объекта, который вы пытаетесь сохранить. Вы можете сделать это в своей подставной консоли.

@venue.save 
... 
=> false 

@venue.errors.messages 
=> ... 

Возможно, вам скажу, что у вас уже есть запись с тем же именем. Если это так, тогда будет разумно, что ваша запись не будет сохранена.

+0

Прохладный! Сегодня я узнал что-то новое, я не знал, что вы можете это сделать. это так говорит, что вы были правы! pry (# )> @ venue.errors.messages => {: "tags.name" => ["уже принято"]} – minlingzhao

+0

@minlingzhao Нет проблем вообще :). Я полагаю, вы здесь новичок? Обратите внимание, что предпочтительный способ сказать «спасибо» здесь - это хорошие вопросы и полезные ответы, а также принятие наиболее полезного ответа на любой интересующий вас вопрос. См. Страницу «О странице», а также «Как мне задавать вопросы здесь»? Увидимся :) –

Смежные вопросы