У меня есть контролер опроса, который собирает 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
Это, безусловно, нелогичный способ сделать это. У меня нет времени, чтобы выписать полный ответ сейчас, но изучите руководства по «вложенным формам» и методу «accepts_nested_attributes_for». Rails может автоматически создавать все ассоциации в представлении, включая любую проверку на дочерних моделях. – RichardAE
Я знаю, что это сильно взломали. Мне было очень трудно заставить его работать с динамическими типами форм для ответов (чтобы разрешить флажки, выбирать и переключаться). –
Альтернативой является создание вложенных атрибутов/отношений на моделях и просто создание пользовательского хэша на стороне контроллера перед созданием UserSurveyAnswer. Пока хеш params правильно отформатирован, вложенные модели будут созданы правильно, и вам не нужно беспокоиться о помощниках формы вообще. – RichardAE