第二个控制器会改进我的rails应用程序中长格式的组织吗?

时间:2018-05-21 06:53:09

标签: ruby-on-rails

我想做什么

我正在使用简单形式的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

问题

我在将其扩展为更大的形式,更长的问题以及问题之间更复杂的关系时遇到了问题。

问题1

短名称q1q2q3,...显示为展示视图中列的标题。为了改变这一点,我将不得不将每个问题分别复制并粘贴到标题中。我认为这是浪费时间,可以使用ruby代码自动化。我目前正在使用label函数来显示问题。

问题2

某些列需要具有相同的名称,即日期,从/到多行。例如,一个人只服用一种药物而另一种服用五种药物。具有五种类型的人在该列字段中具有5倍的行数来填充。

我的解决方案

我可能有Questions控制器,我或管理员可以在其中添加问题。然后每个字段都是一个字符串。然后会有第二个控制器,可能是Answers控制器,其中输入字段的问题部分将是来自Questions控制器的各个问题。然后,Answers控制器将处理用户的答案输入器并保存,以便每个Questionnaire的显示视图将来自Questions控制器的问题作为列的标题和然后是来自Answers控制器的答案。

问题

  • 我是否以正确的Rails方式将其可视化?
  • 有没有更好的方法来组织这个长形式?
  • 是否需要两个控制器,或者三个或更多?
  • 我如何处理多个和不断变化的输入数量(即,如果一个人服用一种药物而另一个人需要输入,比如五种类型)?
  • 如果我的双控制器的想法是要走的路,我该如何加入他们以便他们可以沟通? (has_many / belongs_to关系等。)

1 个答案:

答案 0 :(得分:0)

在一个页面上包含太多字段不是一个好的UX。使用多步骤表单https://medium.com/@nicolasblanco/developing-a-wizard-or-multi-steps-forms-in-rails-d2f3b7c692ce

首先,您需要设计满足要求的数据模型。建议以下型号:

  1. 类别:类型(预期响应类型) - 选择列表,文本,文本数组,布尔值,日期等。
  2. 问题:序列号(问题的顺序),category_id,标题等。还包括选项(选择列表类型的问题的选项数组)。
  3. 患者:姓名等。
  4. 回复(答案):patient_id,question_id,回复(text / json或每个一个)
  5. 对于动态列表(例如:服用药物),提供+ BUTTON并使用javascript添加新的输入字段。

    请将上述内容视为高级方法而非详细解决方案。