RoR Проверка зависимых моделей, но не остановка родительского в случае сбоя зависимой проверки - PullRequest
1 голос
/ 29 октября 2019

Это очень простая проблема, но она меня раздражает.

У меня есть две модели, комментарии и заметки. У комментария может быть одна заметка или ее нет. Заметки имеют только текстовое поле. У них есть общая форма с полем accepts_nested_attributes_for.

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

Я подозреваю, что это тривиальная проблема, но я проклят, если смогу ее решить.

Я попытался validates :text, presence: true, на заметку, но,когда это терпит неудачу, это предотвращает создание родительского комментария, который не является тем, что требуется. Grrr.

note.rb

class Note < ApplicationRecord
    belongs_to :comment
    validates :text, presence: true

comment.rb

class Comment < ApplicationRecord
   ...
  has_one :note, dependent: :destroy
  accepts_nested_attributes_for :note

comment / _form.html.erb

    <%= form.fields_for :note do |note_form| %>
      Notes<br />
      <%= note_form.text_area :text, cols: 57, rows: 8 %>
    <% end %>`

Я полагаю, он делает то, что должен делать. Я просто не хочу, чтобы это делалось ... Виртуальная пинта для всех, кто может помочь.

1 Ответ

0 голосов
/ 29 октября 2019

Новый ответ.

Я посмотрел на вашу проблему и выяснил, что accepts_nested_attributes_for [ПРИМЕЧАНИЕ ссылка для рельсов 6, но такая же, как и для рельсов 5], ожидает дополнительные параметры. Одним из которых является reject_if, это означает, что вы можете передать процедуру, и если она вернет false, вложенная запись не будет сохранена.

Так что, в вашем случае, вы можете сделать следующее

# app/models/note.rb
class Note < ApplicationRecord
  belongs_to :comment, optional: true
end

# app/models/comment.rb
class Comment < ApplicationRecord
  has_one :note, dependent: :destroy
  accepts_nested_attributes_for :note, reject_if: proc { |attributes| attributes['text'].blank? }
end

Обратите внимание, что,

accepts_nested_attributes_for :note, reject_if: proc { |attributes| attributes['text'].blank? }

, который вернет false, если текст заметки будет пустым, и, в свою очередь, избегайте сохранения пустой записи заметки.

У меня был быстрый тест, и это работает в моем приложении rails 5.2. \ o /

Вы можете обратиться к моему приложению с минимальным количеством рельсов на github, если необходимо: sameera207 / so-question-58599317

Первоначальный ответ, не работает

Если предположить, что это рельсы 5, попробуйте :inverse_of

ОБНОВЛЕНИЕ: optional: true добавлено после комментария OP

class Note < ApplicationRecord
    belongs_to :comment, inverse_of: :notes, , optional: true
    validates :text, presence: true
class Comment < ApplicationRecord
   ...
  has_one :note, dependent: :destroy, inverse_of: :comment
  accepts_nested_attributes_for :note

Это очень хорошая статья о: inverse_of , в которой говорится о accepts_nested_attributes_for, и я думаю, что у вас проблема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...