我想做的是
我使用的是简单的创业板。我的表格有大约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
endQuestionnaires控制器只是由一个脚手架生成:
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问题
我很难把它扩展到更大的形式,更长的问题,以及更复杂的问题之间的关系。
问题1
简称q1,q2,q3 .显示为显示视图中列的标题。为了改变这一点,我将不得不将每个问题分别复制和粘贴到标题中。我认为这是浪费时间,可以用红宝石代码实现自动化。我目前正在使用label函数来显示这些问题。
问题2
有些列需要具有相同的名称,即日期、从多行到多行。例如,一个人只服用一种药物,而另一种只服用五种药物。具有五种类型的人在该列字段中有5倍多的行要填写。
我的解决方案
我可能有Questions控制器,在这里我或管理员可以添加问题。那么每个字段都是一个字符串。然后会有第二个控制器,也许是一个Answers控制器,其中输入字段的问题部分将是来自Questions控制器的各个问题。然后,Answers控制器将处理用户输入的答案并保存,以便每个Questionnaire的显示视图将来自Questions控制器的问题作为列的标题,然后从下面的Answers控制器中得到答案。
问题
has_many/belongs_to关系等)发布于 2018-05-22 02:16:10
在一个页面中包含太多的字段并不是一个好的用户体验。使用多步表单https://medium.com/@nicolasblanco/developing-a-wizard-or-multi-steps-forms-in-rails-d2f3b7c692ce
首先,您需要设计一个满足需求的数据模型。建议下列模式:
对于动态列表(例如:药物服用),提供一个+按钮并使用javascript添加一个新的输入字段。
请将上述内容视为一种高层次的方法,而不是一种详细的解决方案。
https://stackoverflow.com/questions/50443469
复制相似问题