我正在使用简单形式的gem。我的表格有大约50个问题和输入。这些问题与健康有关,例如“您曾经为XXX服用过药物吗?”。像这样的一些问题有相关的领域,如“日期”,“医学类型”,“我正在服用/我过去采取过这种方式”。这类问题最难,因为它必须在表格布局中,并且该人可以输入多种药物。我将放五个空白行,但理想情况下我想让用户添加所需数量。
当我开始创建表单时,我设想了一个包含简单字段(name:string, age:integer, weight:decimal, sex:boolean
等)的简短表单,但是表单很快变得太大而且很难以这种方式管理。
我目前只有Questionnaire
控制器。我创建了一个表格的缩减测试版本。以下是与此测试表相关的文件。以下是部分_form.html.erb
:
<%= simple_form_for(@questionnaire) do |f| %>
<%= f.error_notification %>
<%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
<div class="form-inputs">
<%= f.input :name %>
<%= f.input :dob %>
<%= f.input :q1 %>
<%= f.input :q2 %>
<%= f.input :q3 %>
#3 fields below are causing the problems (q4, q5, q6)
<%= f.input :q4 %>
<%= f.input :q5 %>
<%= f.input :q6 %>
<%= f.input :q7 %>
<%= f.input :q8 %>
<%= f.input :q9 %>
<%= f.input :q10 %>
<%= f.input :q11 %>
<%= f.input :q12 %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
schema.rb
ActiveRecord::Schema.define(version: 20180516082217) do
create_table "questionnaires", force: :cascade do |t|
t.string "name"
t.date "dob"
t.string "q1"
t.string "q2"
t.string "q3"
t.text "q4"
t.text "q5"
t.text "q6"
t.boolean "q7"
t.boolean "q8"
t.boolean "q9"
t.integer "q10"
t.integer "q11"
t.integer "q12"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
Questionnaires
控制器只是由脚手架生成:
class QuestionnairesController < ApplicationController
before_action :set_questionnaire, only: [:show, :edit, :update, :destroy]
# GET /questionnaires
# GET /questionnaires.json
def index
@questionnaires = Questionnaire.all
end
# GET /questionnaires/1
# GET /questionnaires/1.json
def show
end
# GET /questionnaires/new
def new
@questionnaire = Questionnaire.new
end
# GET /questionnaires/1/edit
def edit
end
# POST /questionnaires
# POST /questionnaires.json
def create
@questionnaire = Questionnaire.new(questionnaire_params)
respond_to do |format|
if @questionnaire.save
format.html { redirect_to @questionnaire, notice: 'Questionnaire was successfully created.' }
format.json { render :show, status: :created, location: @questionnaire }
else
format.html { render :new }
format.json { render json: @questionnaire.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /questionnaires/1
# PATCH/PUT /questionnaires/1.json
def update
respond_to do |format|
if @questionnaire.update(questionnaire_params)
format.html { redirect_to @questionnaire, notice: 'Questionnaire was successfully updated.' }
format.json { render :show, status: :ok, location: @questionnaire }
else
format.html { render :edit }
format.json { render json: @questionnaire.errors, status: :unprocessable_entity }
end
end
end
# DELETE /questionnaires/1
# DELETE /questionnaires/1.json
def destroy
@questionnaire.destroy
respond_to do |format|
format.html { redirect_to questionnaires_url, notice: 'Questionnaire was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_questionnaire
@questionnaire = Questionnaire.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def questionnaire_params
params.require(:questionnaire).permit(:name, :dob, :q1, :q2, :q3, :q4, :q5, :q6, :q7, :q8, :q9, :q10, :q11, :q12)
end
end
我在将其扩展为更大的形式,更长的问题以及问题之间更复杂的关系时遇到了问题。
短名称q1
,q2
,q3
,...显示为展示视图中列的标题。为了改变这一点,我将不得不将每个问题分别复制并粘贴到标题中。我认为这是浪费时间,可以使用ruby代码自动化。我目前正在使用label
函数来显示问题。
某些列需要具有相同的名称,即日期,从/到多行。例如,一个人只服用一种药物而另一种服用五种药物。具有五种类型的人在该列字段中具有5倍的行数来填充。
我可能有Questions
控制器,我或管理员可以在其中添加问题。然后每个字段都是一个字符串。然后会有第二个控制器,可能是Answers
控制器,其中输入字段的问题部分将是来自Questions
控制器的各个问题。然后,Answers
控制器将处理用户的答案输入器并保存,以便每个Questionnaire
的显示视图将来自Questions
控制器的问题作为列的标题和然后是来自Answers
控制器的答案。
has_many
/ belongs_to
关系等。)答案 0 :(得分:0)
在一个页面上包含太多字段不是一个好的UX。使用多步骤表单https://medium.com/@nicolasblanco/developing-a-wizard-or-multi-steps-forms-in-rails-d2f3b7c692ce
首先,您需要设计满足要求的数据模型。建议以下型号:
对于动态列表(例如:服用药物),提供+ BUTTON并使用javascript添加新的输入字段。
请将上述内容视为高级方法而非详细解决方案。