В Rails, как мне создать ссылку на новый дочерний элемент, когда родительский элемент еще не существует?

#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-3.1 #link-to

#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-3.1 #ссылка на

Вопрос:

Я создаю форму для создания объекта экзамена, который начинается с 1 вопроса, и я хочу иметь кнопку для «Нового вопроса», которая будет отображаться в другом поле вопроса.

Форма отлично работает только с одним вопросом, моя проблема возникает, когда я пытаюсь создать ссылку на AJAX в другом поле вопроса. Если я использую что-то вроде:

 <%= link_to "New Question", new_exam_question_path(@exam), :remote => true %>
  

rails выдает ошибку no route matches, потому что @exam на самом деле еще не существует. Если я заменю @exam на Exam.find(10), он будет работать должным образом, чтобы сгенерировать ссылку для экзамена 10.

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

 <%= form.fields_for :questions do |f| %>
  <div class="edit_questions">
      <div class="exam_question">
        <%= f.hidden_field :question_type %>
        <%= f.label "Question" %><br/>
        <%= f.text_field :copy %>
          <div>
            <% if !f.object.id.blank? %>
              <%= link_to "Delete", exam_question_path(@exam, f.object), :method=>:delete, :class => "button" %>
            <% end %>
          </div>
      </div>
  </div>
<% end %>
  

Комментарии:

1. Вы смотрели этот Railscast и его продолжение?

2. У меня нет, но я проверю это. Спасибо

3. эти 2 railscasts были бесценны, и теперь у меня все работает. Спасибо!

4. @AdamEberlin, переместил мой ответ в нужное место, у меня не было достаточного кредита на SO, чтобы сразу ответить на свой вопрос, поэтому я просто вставил его в вопрос, чтобы другие не тратили свое время. Спасибо за подсказку.

Ответ №1:

Решаемая: rails приведения 196 и 197 дают вам всю информацию, необходимую для решения моей проблемы.

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

Ответ №2:

Почему бы просто не создать экземпляр пустого объекта exam в контроллере перед отображением представления?

 @exam = Exam.new
  

Комментарии:

1. Это уже происходит в «новом» методе, но просмотр по-прежнему завершается неудачно, предположительно, потому, что в пуле нет идентификатора для ссылки.