2014-10-20 48 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所有,它只是使用普通的欄杆助手。

此代碼未經過測試,因此無法確定它是否可以正常工作,但希望它能幫助您走上正確的軌道。

相關問題