定义问题先于解决问题

昨天学习了如何将一个表单分成多个步骤来实现。

通常一个表单需要填的东西太多时,如果一次过呈现出来,会是满满一屏幕,让用户感觉到压力。如果将这个保单拆成多个步骤,分成多个网页来完成,可以缓解用户填写的压力。

要做到这个功能,有两种思路,第一种是纯前端,用 JS 特效将一个表单拆分成多个步骤。这种方法要到最后一步提交才会把表单存到服务器中,也就是说中途关掉网页的话,所填写的内容就会丢失。

另一种方法是把每一个步骤所填写的内容都保存到服务器中,关掉网页,随时回来都可以从原来的步骤接着往下写。这种方法的关键思路是,第一次填写表单时,完成第一步骤时是 create ,以后的每一个步骤其实都是 update

另外要注意的是,表单中有些栏位是必填的,存入时数据库需要做数据验证。在分步骤填写的时候,有些栏位的数据验证就要设置条件,在步骤 1 的时候,还没出现的栏位如果要验证,就无法写入数据库了。

实现方法是用 :if 来做条件判断,比如说

class Registration < ApplicationRecord
attr_accessor :current_step
validates_presence_of :name, :email, :cellphone, :if => :should_validate_basic_data?
# ...
protected
  #...
  def should_validate_basic_data?
    current_step == 2
  end
end

这里面用到 attr_accessor 方法,作用是新建一个虚拟属性,上面这个例子声明了 :current_step 作为 Registration 的一个属性,但是这个属性在数据库中并不存在,只存在于 ActiveRecord 层面。这种用法通常是用来记录一些临时变量。

「分步骤填写表单」这样的功能是来源于对用户体验的考虑。功能是为用户服务的,是为体验服务的。很多时候,「你会做什么功能?这门编程语言能做什么功能?」这样的问题通常并不是最重要,更重要的是「你想做什么功能?用户需要怎样的功能?」

换句话说,「定义问题」比「解决问题」更重要。衡量一个好问题的标准,我觉得可能主要是两个方面

  1. 切中当下需求;
  2. 工程上具有可行性。

今天是周五了,又一周,好好反思一下这一周做的事情,是在解决一些真正的「需求」吗?

· rails