带有Rails的单模型多步形式3

时间:2011-01-18 10:55:33

标签: ruby-on-rails forms workflow state-machine

我正在尝试使用ActiveRecord持久性执行多步骤表单。

首先,用户提交表单并创建“用户”。

稍后,管理员审核“用户”,并且可以1)拒绝该用户或2)要求提供更多信息。

然后生成另一个表单供用户提供新信息。

等等。

它很像一台状态机,但没有一个可用的宝石有清晰的文档。另外,我想我依赖于控制器的自定义操作。

不知道我的设计是不是很糟糕,还是有正确的方法可以做到这一点?

感谢。

3 个答案:

答案 0 :(得分:3)

我不知道这样做的正确方法是什么,但在我的项目中,我通过向用户模型添加状态字段来实现。所以,例如:

  • status = 0 - 新用户
  • status = 1 - 管理员拒绝该用户
  • status = 2 - admin要求提供更多信息

然后,您必须根据状态字段为用户生成正确的表单。您可以在控制器中执行此操作:

def multistep_form
  @user = User.find(params[:id])
  case @user.status
  when 0
    render "form_1"
  when 1
    render "rejected"
  when 2
    render "form_2"
  else
    render "error"
  end
end

或视图中的某个地方:

<%= render :partial => "form_{@user.status}" %>

然后你需要有部分内容:_form_1_form_2_form_3

这只是一个示例,在实际解决方案中,您还需要保护status字段不被用户更改并向status字段添加一些验证,因此它不会是0,1 ,和2.

答案 1 :(得分:2)

我不知道这是否正是您正在寻找的,但希望它会让您指出正确的方向。

Ryan Bates在六月份做了一次Railscast - http://railscasts.com/episodes/217-multistep-forms

答案 2 :(得分:1)

如果您在用户完成这些步骤时开始执行逻辑操作,则考虑使用状态机可能会更清晰。

我对http://dev.netizer.pl/transitions-state-machine-for-rails-3.html

非常满意

然后您可以执行user.approve!

之类的操作

并挂断状态机中单独表示的操作,例如发送电子邮件。一旦每个转换获得超过1或2个动作,或者必须添加新的转换,它就开始有意义建模为状态机,恕我直言。