2014-10-20 49 views
0

我有问题模型和答案模型。Rails4:Formtastic3.0,同时保存多个实例(对于Answer模型)

每个问题每个用户可以有一个答案。我试图预设给用户的形式来回答所有的问题,但想不出真正弄清楚如何与formtastic

这里做的是我迄今为止

- @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 

我试图得到一些从How to loop through two alternating resources on a form?但我不断收到“类未定义的方法`MODEL_NAME”:类”暗示了@questions如果我尝试:

= semantic_form_for @questions do |q| 
    = q.input :content 
    = q.semantic_fields_for @answer do |a| 
    = a.inputs :content 
    = q.actions 

基于Railscast 198, but using formtastic这是我尝试不工作,要么:

- 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" 

注:

1]我想有用户按提交一次后,他又增加/编辑所有的答案

2]如果有一个答案已经存在,它应该是预poulated在文本框中

3]我用simple_form宝石如果让不介意生活更轻松

+0

你的模型是什么样子的?它们是如何相互关联的?你有一个问题,答案和用户模型,但是你有什么定义了什么问题出现在表单中(也许是一个测验模型)? – 2014-10-20 23:17:00

+0

所有问题都出现在表单中。 @questions = Question.all – codeObserver 2014-10-20 23:19:09

回答

0

而是然后又做了形式@questions你需要一个对象传递给你的表格帮手(@questions是一系列问题)。达成此目的的一个好方法是通过form object

# 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 

然后在您的控制器,你必须:

# 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 

在你看来,你会想沿着线的东西:

# 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" 

这并不在使用formtastic所有,它只是使用普通的栏杆助手。

此代码未经过测试,因此无法确定它是否可以正常工作,但希望它能帮助您走上正确的轨道。

相关问题