У меня есть 3 модели здесь: NewWord
, VerbForm
и AdjForm
.Проверьте состояние перед сохранением вложенного объекта в Rails
В NewWord
модели, у меня есть столбец word_type
сохраненного тип слова: Adj Noun Verb Phrase GenericWord
Каждый NewWord может иметь 1 VerbForm или 1 AdjForm
Class NewWord < ApplicationRecord
has_one :adj_form, dependent: :destroy
has_one :verb_form, dependent: :destroy
accepts_nested_attributes_for :adj_form, allow_destroy: true
accepts_nested_attributes_for :verb_form, allow_destroy: true
def self.types
%w(Adj Noun Verb Phrase GenericWord)
end
end
class NewWord::AdjForm < ApplicationRecord
belongs_to :new_word
end
class NewWord::VerbForm < ApplicationRecord
belongs_to :new_word
end
Я использую эту форму, чтобы создать слово вместе с ним образует
<%= simple_form_for new_word, remote: true do |f| %>
<div class="error_section"></div>
<%= f.input :word %>
<%= f.input :kanji_version %>
<%= f.input :word_type, collection: NewWord.types %>
<%= f.simple_fields_for :verb_form do |v| %>
<%= v.input :verb_type %>
<%= v.input :dictionary_form %>
# Other fields
<% end %>
<%= f.simple_fields_for :adj_form do |a| %>
<%= a.input :adj_type %>
# Other fields
<% end %>
<%= f.button :submit %>
<% end %>
Моя идея здесь, когда пользователь выбирает word_type
из выпадающего списка, я могу использовать Javasrip t, чтобы скрыть или показать поля для AdjForm
или VerbForm
, или и то, и другое. Затем при отправке я сохраняю только AdjForm
, если новое слово word_type
является «Adj», или VerbForm
, если word_type
- это «Глагол».
Итак, как я могу это достичь? Так как вложенный объект автоматически сохраняется, когда я запускаю это в новом слове create
метод: @new_word.save.
?
Я попробовал reject_if
, но он возвращает только параметры для вложенного объекта!
accepts_nested_attributes_for :adj_form, allow_destroy: true, reject_if: :not_adj
def not_adj(att)
att['new_word']['word_type'] != 'Adj' # Found out "att" here only has attributes of AdjForm , not NewWord !
end