Вложенные объектные модели, циклы в представлении и ошибочный ввод делают циклы представления странными - PullRequest
0 голосов
/ 17 ноября 2009

Я довольно долго гуглял и тестировал эту проблему, но не могу найти ответ.

У меня есть сайт, на котором опросы серверов загружаются админами. Эти опросы относятся к опросным циклам, а ответы относятся к ответам.

class Answering < ActiveRecord::Base
  has_many :answers
  accepts_nested_attributes_for :answers, :allow_destroy => true
  has_many :alternative_answers, :through => :answers
  accepts_nested_attributes_for :alternative_answers, :allow_destroy => true
  validate :check_for_fail
end

class Answer < ActiveRecord::Base
 belongs_to :answering
 has_many :alternative_answers, :dependent => :destroy
 accepts_nested_attributes_for :alternative_answers

Контроллер достаточно прост для вложенных объектов

def new
 if @surveycycle.nil?
   @surveycycle = Surveycycle.find(params[:surveycycle_id])
   if !params[:game_id].nil?
     @game = Game.find(params[:game_id])
     @game_id = @game.id
   else
     @game_id = nil
   end
   if @answering.nil?
     @answering = Answering.new()
     @answering.answers.build
     @answering.answers.each do |x|
       x.alternative_answers.build
     end
   end
   @surveys = []
   for survey in @surveycycle.surveys
     @surveys << Survey.find(survey.id, :include => [:sub_surveys, :questions])
   end
 end
end

Все внутри if, потому что render: action => "new", кажется, использует объекты в create.

def create
@surveycycle = Surveycycle.find(params["answering"].delete(:surveycycle_id).to_i)
if !params[:answering][:game_id].nil? and !params[:answering][:game_id].empty?
  @game = Game.find(params[:answering][:game_id])
  @game_id = @game.id
else
  @game = nil
  @game_id = nil
end

#If user is not logged in, use a fakeuser
if !logged_in?
  @fakeuser = Fakeuser.new
  @fakeuser.save
  @answering = Answering.new(params[:answering].merge({:fakeuser_id => @fakeuser.id}))
else
  @answering = Answering.new(params[:answering])
end

@surveys = []
for survey in @surveycycle.surveys
  @surveys << Survey.find(survey.id, :include => [:sub_surveys, :questions])
end
#Dummy version for debugging
render :action => "new"

Представления, которые я обрабатываю с частями, вот так

new.html.erb

<% form_for :answering, @answering, :url => {:action => "create"}, :html => {:method => :post} do |all_f| %>
 <%= all_f.error_messages %>
 <%= all_f.hidden_field :game_id, :value => @game_id %>
 <% if logged_in? %>
   <%= all_f.hidden_field :user_id, :value => current_user.id %>
 <% end %>
 <%= all_f.hidden_field :surveycycle_id, :value => @surveycycle.id %>
 <% @surveys.each_with_index do |survey, survey_index| %>
  <div id="whole_survey">
    <% survey.sub_surveys.each_with_index do |sub_survey, sub_survey_index| %>
      <div id="sub_survey">
        <b><div id="sub_survey_name"><%= sub_survey.name %> </div></b><br>
        <% sub_survey.questions.each_with_index do |question, question_index| %>
          <table>
            <div id="question">
              <% all_f.fields_for :answers do |f| %>
                <%= render :partial => 'answer', :locals => {:f => f, :question => question} %>
              <% end %>
            </div>
          </table>
        <% end %>
      </div>
    <% end %>
  </div>
 <% end %>
 <%= all_f.submit t('answer') %>
<% end %>

Материал в части представления довольно раздутый, поскольку вопросы могут быть самыми разными

Теперь о пролеме! Когда пользователь отправляет эту форму, он, очевидно, снова визуализирует форму (я заставляю создаваемые действия отвечающих контроллеров 'render: action => "new" для отладки этой проблемы, которая у меня есть). Вместо того, чтобы снова получать ту же форму, вопросы отображаются в x раз больше, где с 8 вопросами x равно 9. Например, при коротком цикле опроса с 8 вопросами после первого представления каждый вопрос отображается 9 раз. Глядя на исходный код страницы, в первый раз вводятся идентификаторы ввода: от 0 до 8, затем от 0 до 80, а затем от 0 до 728 внезапно.

Я проиллюстрирую это:

  ..surveystuff..
             Q: I was immersed in the game
    Very immersed o o x o o o o not at all immersed
  ..surveystuff..

После того, как пользователь нажмет кнопку отправки, он станет:

  ..surveystuff..
             Q: I was immersed in the game
             Q: I was immersed in the game
             Q: I was immersed in the game
             Q: I was immersed in the game
             Q: I was immersed in the game
             Q: I was immersed in the game
             Q: I was immersed in the game
             Q: I was immersed in the game
             Q: I was immersed in the game
             Q: I was immersed in the game
    Very immersed o o x o o o o not at all immersed
    Very immersed o o o o o o o not at all immersed
    Very immersed o o o o o o o not at all immersed
    Very immersed o o o o o o o not at all immersed
    Very immersed o o o o o o o not at all immersed
    Very immersed o o o o o o o not at all immersed
    Very immersed o o o o o o o not at all immersed
    Very immersed o o o o o o o not at all immersed
    Very immersed o o o o o o o not at all immersed
    Very immersed o o o o o o o not at all immersed
  ..surveystuff..

Может ли это быть ошибкой или чем-то другим, или я что-то не так делаю?

Я могу опубликовать больше материалов, если это необходимо.

1 Ответ

0 голосов
/ 25 ноября 2009

Попробуйте отрендерить частичное с помощью подпути.

<%= render :partial => 'answers/answer', :locals => {:f => f, :question => question} %>
...