首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第二个控制器会在我的rails应用程序中改进长形式的组织吗?

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

Stack Overflow用户
提问于 2018-05-21 06:53:08
回答 1查看 47关注 0票数 1

我想做的是

我使用的是简单的创业板。我的表格有大约50个问题和输入。这些问题是与健康有关的,例如“你曾经为XXX开过药吗?”有些类似的问题有相关的领域,如“日期”、“医学类型”、“我目前正在/我在过去吃过这个”。这种类型的问题是最难的,因为它必须在一个表的布局和人可以输入多种药物。我将放置五行空白行,但理想情况下,我希望让用户添加尽可能多的需要。

当我开始创建表单时,我设想了一个带有简单字段(name:string, age:integer, weight:decimal, sex:boolean等)的短表单,但是表单很快变得太大,太长,无法以这种方式管理。

到目前为止我是如何实现它的?

我目前只有Questionnaire控制器。我创建了一个简化的表单测试版本。下面是与此测试表单相关的文件。这是部分_form.html.erb的形式

代码语言:javascript
复制
<%= 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

代码语言:javascript
复制
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控制器只是由一个脚手架生成:

代码语言:javascript
复制
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 .显示为显示视图中列的标题。为了改变这一点,我将不得不将每个问题分别复制和粘贴到标题中。我认为这是浪费时间,可以用红宝石代码实现自动化。我目前正在使用label函数来显示这些问题。

问题2

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

我的解决方案

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

问题

  • 我用正确的Rails方式来想象这一切吗?
  • 有没有更好的方法来组织这么长的表格?
  • 需要两个控制器,还是三个,或者更多?
  • 我如何处理多个和不断变化的输入数(即,如果一个人正在服用一种药物,而另一种需要进入,例如五种类型)?
  • 如果我的两个控制器的想法是要走的路,我如何去加入他们,以便他们可以沟通?(has_many/belongs_to关系等)
EN

回答 1

Stack Overflow用户

发布于 2018-05-22 02:16:10

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

首先,您需要设计一个满足需求的数据模型。建议下列模式:

  1. 类别:类型(预期响应类型)-选择列表、文本、文本数组、布尔值、日期等。
  2. 问题:序号(问题的顺序),category_id,标题等也包括选项(挑选列表类型问题的选项数组)。
  3. 病人:姓名等。
  4. 响应(答案):patient_id、question_id、response(文本/json或每人一个)

对于动态列表(例如:药物服用),提供一个+按钮并使用javascript添加一个新的输入字段。

请将上述内容视为一种高层次的方法,而不是一种详细的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50443469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档