【问题标题】:Rails4: Formtastic3.0 , save multiple instances (for Answer models) at the same timeRails4: Formtastic3.0 ,同时保存多个实例(对于Answer模型)
【发布时间】:2014-10-20 00:24:19
【问题描述】:

我有问题模型和答案模型。

每个用户的每个问题都可以有一个答案。我正在尝试为用户预设一个表单来回答所有问题,但无法真正弄清楚如何使用 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? 获得一些提示,但如果我尝试,我会不断收到 @questions 的“未定义的方法 `model_name' for Class:Class”:

= 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] 如果已经存在答案,则应将其预先填充在文本框中

3] 如果可以让生活更轻松,我不介意使用 simple_form gem

【问题讨论】:

  • 您的模型是什么样的,它们之间的关系如何?您有问题、答案和用户模型,但您是否有定义表单中出现的问题的内容(可能是测验模型)?
  • 所有问题都出现在表格中。 @questions = Question.all

标签: html forms ruby-on-rails-4 simple-form formtastic


【解决方案1】:

而不是为@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,它只是使用普通的rails表单助手。

此代码未经测试,因此不确定它是否有效,但希望它能帮助您走上正轨。

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多