我正在尝试使用ActiveRecord持久性执行多步骤表单。
首先,用户提交表单并创建“用户”。
稍后,管理员审核“用户”,并且可以1)拒绝该用户或2)要求提供更多信息。
然后生成另一个表单供用户提供新信息。
等等。
它很像一台状态机,但没有一个可用的宝石有清晰的文档。另外,我想我依赖于控制器的自定义操作。
不知道我的设计是不是很糟糕,还是有正确的方法可以做到这一点?
感谢。
答案 0 :(得分:3)
我不知道这样做的正确方法是什么,但在我的项目中,我通过向用户模型添加状态字段来实现。所以,例如:
然后,您必须根据状态字段为用户生成正确的表单。您可以在控制器中执行此操作:
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个动作,或者必须添加新的转换,它就开始有意义建模为状态机,恕我直言。