2016-11-06 3 views
0

Я пытаюсь использовать простую форму с драгоценным камнем кокона, чтобы вложить формы детей в форму родительского класса.Rails - Cocoon Gem - заполняющий внешний ключ id

У меня есть модели для предложения и подачи.

Ассоциации являются:

Предложение

has_one :pitch, inverse_of: :proposal 
    accepts_nested_attributes_for :pitch, reject_if: :all_blank, allow_destroy: true 

Pitch

belongs_to :proposal, inverse_of: :pitch 

В моей форме заявки, у меня есть:

<%= f.simple_fields_for :pitch do |f| %> 
     <%= f.error_notification %> 
      <%= render 'pitches/pitch_fields', f: f %> 

     <% end %> 

     <%= link_to_add_association 'Pitch', f, :pitch, partial: 'pitches/pitch_fields' %> 

В мой контроллер предложения, у меня есть :

def new 
    @proposal = Proposal.new 
    @proposal.build_pitch 
    # authorize @proposal 
    end 

    def edit 
    @proposal.build_pitch unless @proposal.pitch 
    end 


def proposal_params 
     params.require(:proposal).permit(:title, :description, 

     pitch_attributes:  [:id, :problem, :solution, :remark, :_destroy ]) 
    end 

Смолы/_pitch_fields.html.erb имеет:

<div class="nested-fields"> 
    <div class="form-inputs"> 
     <%= f.input :problem, as: :text, 
      # :label => text_for_problem(current_user, @pitch.proposal), 
      :label => 'What issue does this proposal address?', 
      :input_html => {:rows => 10} %> 
     </div> 

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

Если я пытаюсь изменить форму, я получаю сообщение об ошибке, которая говорит:

Couldn't find Pitch with ID=5 for Proposal with ID=10 

Когда я пытаюсь:

pitch.errors.full_messages 
NameError: undefined local variable or method `pitch' for main:Object 

Что мне нужно сделать для того, чтобы заставить proposal_id атрибут в таблице тангажа, которая должна быть установлена ​​с идентификатором предложения?

+0

Вы получили ошибку при сохранении формы после редактирования? – nathanvda

+0

да - это правильно – Mel

ответ

2

Это немного странно, и imho ошибка в рельсах, но link_to_add_association попытается построить новый pitch, чтобы иметь возможность отображать его правильно. Это будет эффективно удалить существующий шаг.

Таким образом, решение состоит в том, чтобы добавить опцию force_non_association_create: true на link_to_add_association. Или просто просто снимите link_to_add_association: зачем он вам нужен? У вас может быть только один шаг, и вы всегда создаете его, если его не существует?

+0

Спасибо Натан. Я попробую сейчас. Я хочу иметь ссылку, потому что, если предложение (которое has_one pitch) создается без тангажа, тогда, когда редактирование проекта будет изменено, я хочу, чтобы ссылка была способна создать поле в форме редактирования заявки. Я попробую ваше предложение сейчас. – Mel

+0

Но в коде вашего контроллера вы всегда добавляете шаг, если его не существует, так что ...? – nathanvda

+0

Я не уверен, что понимаю, что вы имеете в виду. Вы имеете в виду, что я должен добавить новую строчку тенора к новому действию в моем контроллере организации? – Mel

0

Вы не указали свой _picthces/pitch_fields_ частично, но убедитесь, что у него есть скрытое поле для proposal_id.

Также добавьте proposal_id в массив pitch_attributes в вашем методе proposal_params.

Если возникли проблемы, поставьте точку останова в методе edit вашего контроллера и проверьте, что находится в proposal_params, и то, что установлено в объекте @proposal.

+0

Зачем мне скрытое поле? В других случаях я использовал кокон - мне не нужно скрытое поле. Ключевое различие между другими видами использования кокона и этого заключается в том, что предложение имеет только один шаг (где каждый другой случай имеет отношение has_many). Я не думаю, что использование скрытого поля является ответом, потому что это не обязательно в любом другом случае использования. – Mel

+0

Ahh, true 'fields_for', вероятно, добавляет это самостоятельно.Но независимо, вам нужно разрешить это в вашем массиве pitch_attributes, правильно? – pdobb

+0

Нет. Мне не нужно делать это в любой другой форме, использующей драгоценный камень кокона. Он обновляется без использования поля внешнего ключа в каждом другом случае, когда я использую кокон. Ключевое различие в этом случае заключается в том, что ассоциация has_one вместо has_many, но я не могу понять, почему это останавливает идентификацию внешнего ключа. – Mel