2016-09-02 2 views
0

У меня есть 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 

ответ

0

В контроллере, перед сохранением, проверьте значение word_type и отбросить Params, что вы не хотите, чтобы сохранить.

new_words_controller.rb

def create 
    prepare_params  
    @new_word = NewWord.new(new_word_params) 
    if @new_word.save 
    # ... 
    else 
    # ... 
    end 
end 

private 
def prepare_params 
    params.delete[:verb_form] if params[:word_type] == "Adj" 
    params.delete[:adj_form] if params[:word_type] == "Verb" 
    params 
end 

Это предполагает, что вы белый список параметров для new_word и его ассоциаций.

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