Rails цикл form_for с вложенными ресурсами - PullRequest
0 голосов
/ 14 июля 2011

У меня есть три ресурса: работа, вопросы и ответы.
Отношения: у работы много вопросов;Вопрос имеет много ответов.

Я создал вложенную форму в представлении формы «Задания», которая включает создание заданий и вопросов.Они оба будут находиться за стеной администратора, но я хочу, чтобы пользователи отвечали на вопросы через форму в представлении формы ответов (не за стеной).

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

Поскольку это цикл, и в нем будет более 1 поля ответа, я хочу вопросыдинамически отображать как метки формы ответа.Это будет отражать путь, поэтому jobs / 1 / questions / 1 / answers / new ( EDIT: это должно быть jobs/1/answers/new) показало бы все вопросы с job_id из 1.

Как мне это сделать?Я думал об использовании нового действия, подобного этому, в контроллере ответов (что я уверен, что это очень неправильно):

def new
  @answer = Answer.new
  10.times do
     @job = Job.find(params[:job_id])
     @question = @job.questions.find(params[:question_id])
     @answer = @question.answers.build(params[:answer])
  end
end

И вот моя текущая форма ответов:

<%= form_for(@answer, :url => job_question_answers_path(@job, @question)) do |f| %>
   <% f.fields_for :answers do |builder| %>
        <%= builder.label @question.question %>
        <%= builder.text_area :answer, :rows => 10 %>
    <% end %>

<%= f.submit "Create" %>
<% end %>

Дайте мне знать, если вам нужна дополнительная информация и спасибо за помощь!

1 Ответ

1 голос
/ 20 июля 2011

Итак, я выяснил, как заставить это работать, и я сделал это, используя эпизод railscasts: http://railscasts.com/episodes/196-nested-model-form-part-1.

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

Я просто вложил форму ответов в форму вопросов о работе / новом действии.Это выглядит так:

<%= form_for(@job) do |f| %>
 <%= f.label :name %><br />
 <%= f.text_field :name %>
  <%= f.fields_for :questions do |builder| %>
   <%= render 'question_fields', :f => builder %>
  <% end %>
 <%= f.submit %>
<% end %>

При частичном вопросе:

<%= f.label :question, "Question" %>
 <%= f.text_area :question, :rows => 10 %>
 <%= f.check_box :_destroy %>
 <%= f.label :_destroy, "Remove Question" %>

  <%= f.fields_for :answers do |builder| %>
   <%= render 'partials/answer_fields', :f => builder %>
  <% end %>

А при частичном ответе:

 <%= f.label "Answer" %>
 <%= f.text_area :answer, :rows => 10 %>
 <%= f.hidden_field :question_id, :value => @question %>
 <%= f.hidden_field :job_id, :value => @job.id %>

Мне пришлось внести измененияв методе Jobs # new:

def new
 @job = Job.new
 10.times do
   question = @job.questions.build 
   1.times { question.answers.build }
 end
respond_to do |format|
  format.html # new.html.erb
  format.xml  { render :xml => @job }
end
end

Наконец, мои ассоциации в моделях должны были включать

accepts_nested_attributes_for

Примерно так:

Модели

class Job < ActiveRecord::Base
 has_many :questions
 has_many :answers

 accepts_nested_attributes_for :questions, :allow_destroy => true
 accepts_nested_attributes_for :answers, :allow_destroy => true
end

class Question < ActiveRecord::Base
  belongs_to :job
  has_many :answers

  accepts_nested_attributes_for :answers 
end

class Answer < ActiveRecord::Base
 belongs_to :job
 belongs_to :question
end

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

Дайте знать, если у вас появятся вопросы.

...