2015-04-15 3 views
0

У меня есть контролер опроса, который собирает questions, answers и user, которые ответили на них в UserSurveyAnswer.Пользовательские параметры сохранения в рельсах

Я пытаюсь расширить его, чтобы также можно было отвечать на текстовые ответы (при необходимости). В настоящее время, вы можете поставить галочку любое количество предоставленных ответов, но я изо всех сил, чтобы продлить его, чтобы текст ответов (:text_answer)

На данный момент, я указываю на эту функцию из моего контроллера

user_survey_answer .rb

def self.update_answer(user_param, user_id) 
    begin 
     user_param[:survey].each do |survey| 
     survey_id = survey[:id] 
     survey[:question].each do |qs| 
      question_id = qs[:id] 
      answer_ids = qs[:answer_ids] 
      answer_ids.collect{|answer_id| self.create({:user_id => user_id, :survey_id =>survey_id, :question_id => question_id, :answer_id => answer_id}) } 

       #new bit, which doesn't work 
      qs[:answer].each do |text_answer| 
       self.create({:user_id => user_id, :survey_id =>survey_id, :question_id => question_id, :answer_id => text_answer[:id], :text_answer => text_answer[:text_answer]}) 
      end 
       #end new bit 

     end 
     end 
     return true 
    rescue Exception => exc 
     return false 
    end 
    end 

Вот как сервер показывает информацию.

"user"=>{"survey"=>[ 
    {"id"=>"1", "question"=>[ 
     {"id"=>"1", "answer_ids"=>["1"]} 
    ] 
    }, 
    {"id"=>"2", "question"=>[ 
     {"id"=>"2", "answer"=>[ 
      {"id"=>"2", "text_answer"=>"dwqdw"} 
     ] 
     } 
    ]} 
]} 

Любые идеи о том, как я могу сделать вышеуказанную информацию (в частности, вторая часть) сохранить в мой UserSurveyAnswer модальным?

EDIT: Полный UserSurveyAnswer Модальные

class UserSurveyAnswer < ActiveRecord::Base 

    validates_uniqueness_of :user_id, :scope => [:survey_id, :question_id, :answer_id] 

    belongs_to :user 
    belongs_to :survey 
    belongs_to :question 
    belongs_to :answer 

    def self.update_answer(user_param, user_id) 
    begin 
     user_param[:survey].each do |survey| 
     survey_id = survey[:id] 
     survey[:question].each do |qs| 
      question_id = qs[:id] 
      answer_ids = qs[:answer_ids] 
      answer_ids.collect{|answer_id| self.create({:user_id => user_id, :survey_id =>survey_id, :question_id => question_id, :answer_id => answer_id}) } 

      text_answer = qs[:answer] 
      UserSurveyAnswer.create(user_id: user_id, survey_id: survey_id, question_id: question_id, answer_id: text_answer[:id], text_answer: text_answer[:text_answer]) 


     end 
     end 
     return true 
    rescue Exception => exc 
     return false 
    end 
    end 


end 
+0

Это, безусловно, нелогичный способ сделать это. У меня нет времени, чтобы выписать полный ответ сейчас, но изучите руководства по «вложенным формам» и методу «accepts_nested_attributes_for». Rails может автоматически создавать все ассоциации в представлении, включая любую проверку на дочерних моделях. – RichardAE

+0

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

+0

Альтернативой является создание вложенных атрибутов/отношений на моделях и просто создание пользовательского хэша на стороне контроллера перед созданием UserSurveyAnswer. Пока хеш params правильно отформатирован, вложенные модели будут созданы правильно, и вам не нужно беспокоиться о помощниках формы вообще. – RichardAE

ответ

0

Во-первых, я хотел бы использовать вложенные атрибуты, так что все это сохраняется автоматически, а не вы делаете все это вручную. Однако я не уверен, что линия self.create имеет смысл. Я никогда раньше не создавал объект из модели. Если я понимаю ваши ассоциации правильно, вы должны поставить:

UserSurveyAnswer.create(user_id: user_id, survey_id: survey_id, question_id: question_id, answer_id: text_answer[:id], text_answer: text_answer[:text_answer]) 

Edit: Так что я бы также изменить строку перед ней:

answer_ids.collect{|answer_id| UserSurveyAnswer.create(user_id: user_id, survey_id: survey_id, question_id: question_id, answer_id: answer_id) } 
+0

Извинения, text_answer - это поле в UserSurveyAnswer. Не модальный. –

+0

Итак, я обновил свой ответ. Если это не сработает, можете ли вы изменить свой пост, чтобы добавить свою модель UserSurveyAnswer? –

+0

Спасибо! Это выглядит хорошо, но по какой-то причине, это не цикл вокруг qs [: answer]. Сейчас я обновляю свой пост. –

0

Я взял его из модальных и понял, что, когда текст вопроса существует, answer_ids не и поэтому функция терпел неудачу на первой линии экономии:

answer_ids.collect{|answer_id| self.create({:user_id => user_id, :survey_id =>survey_id, :question_id => question_id, :answer_id => answer_id}) } 

После того, как я добавил в обработке для этого исключения (и последующего обращения за второй сохранить) все это Worke d!

Спасибо @ryan k за вашу помощь

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