html - tag - Rails4: Formtastic3.0, guarde varias instancias(para los modelos de Answer) al mismo tiempo
simple_fields_for (1)
En lugar de crear un formulario para @questions
, debe pasar un solo objeto a su asistente de formulario ( @questions
es una matriz de preguntas). Una buena manera de lograr esto es a través de un objeto de forma .
# app/forms/questions_form.rb
class QuestionsForm
include ActiveModel::Model
def initialize(user)
@user = user
end
def questions
@questions ||= Question.all
end
def submit(params)
params.questions.each_pair do |question_id, answer|
answer = Answer.find_or_initialize_by(question_id: question_id, user: current_user)
answer.content = answer
answer.save
end
end
def answer_for(question)
answer = answers.select { |answer| answer.question_id == question.id }
answer.try(:content)
end
def answers
@answers ||= @user.answers.where(question: questions)
end
end
Luego, en su controlador tendría:
# app/controllers/submissions_controller.rb
Class SubmissionsController < ApplicationController
...
def new
@questions_form = QuestionsForm.new(current_user)
end
def create
@questions_form = QuestionsForm.new(current_user)
@questions_form.submit(params[:questions_form])
redirect_to # where-ever
end
...
end
En su opinión, querrá algo como:
# app/views/submissions/new.html.haml
= form_for @questions_form, url: submissions_path do |f|
- @questions_form.questions.each do |question|
%p= question.content
= f.text_field "questions[#{question.id}]", value: @questions_form.answer_for(question)
= f.submit "Submit"
Esto no usa formtastic en absoluto, solo usa los rieles simples como ayudantes.
Este código no se ha probado, por lo que no estoy seguro si funciona, pero espero que te ayude a seguir el camino correcto.
Tengo modelo de pregunta y un modelo de respuesta.
Cada pregunta puede tener una respuesta por usuario. Estoy tratando de predefinir a un usuario un formulario para responder a todas las preguntas, pero realmente no pude entender cómo hacerlo con formtastic
Esto es lo que tengo hasta ahora
- @questions.each do |q|
= q.content
- ans = @user.answers.where(question_id:q.id).first.try(:content) || q.description
= semantic_form_for @answers do |f|
= f.label q.content
= f.inputs :content, placeholder: ans
= f.actions
Estoy tratando de obtener alguna pista de Cómo pasar a través de dos recursos alternativos en un formulario. pero sigo obteniendo el "método no definido` model_name ''para Class: Class "para @questions si intento:
= semantic_form_for @questions do |q|
= q.input :content
= q.semantic_fields_for @answer do |a|
= a.inputs :content
= q.actions
Basado en Railscast 198, pero el uso de formtastic aquí es mi intento que tampoco funciona:
- semantic_form_for :Answer, :url => api_v1_answers_path, :method => :put do |f|
- @questions.each do |q|
- f.fields_for ''questions[]'', q do |ff|
= q.content
= ff.input
= submit_tag "Submit"
Nota:
1] Me gustaría que el usuario presione enviar solo una vez después de haber agregado / editado todas las respuestas
2] Si hay una respuesta ya presente, debe ser pre-pulada en el cuadro de texto
3] No me importa usar la gema simple_form si eso hace la vida más fácil