我正在编写一个具有“向导”类型输入部分的应用程序。想想MS Windows安装程序。
我很难搞清楚使用rails的最RESTful方式。我可以用非平静的方式实现它(已经为应用程序的第1版做了),但这次我试图变得更加惯用。
这是情况。我有一个5步向导,必须收集信息。步骤1,2和4处理资源A.步骤3处理资源B的倍数,并且必须将它们与资源A相关联。步骤5只是确认。
所以我有我的resourceA_controller和我的resourceB_controller ...但他们只保存/更新那个资源。我猜我应该为流程中的每个步骤设置一个wizard_controller,但我不确定路由应该如何工作。
例如......
WizardController < ApplicationController
def stepOne
@resourceA = ResourceA.new
end
def stepTwo
@resourceA = params[:id]
end
...
def stepFive
end
end
然后我会将我的观点放在StepOne视图上:
<form action='/resourceA/new'/>
以及StepTwo动作
<form action='/resourceA/12345/edit'/>
等
但是我的resourceA和resourceB控制器必须知道如何重定向到wizard_controller中的相应步骤。纠缠不清!
我是否在正确的轨道附近?或者是否有一个rails内置机制或插件来执行此类操作。
答案 0 :(得分:1)
理解REST提供的内容与REST不关心的内容之间的区别非常重要。
RESTful服务提供了一组最小的操作,客户端可以使用这些操作(假设它知道正确的数据格式)来操作一类资源
/resourceA/12345
来编辑现有资源RESTful服务不保证哪些其他URL会返回有意义的响应。
一个值得注意的例子是REST没有指定/resourceA/12345/edit
将返回一个用于编辑该资源的HTML表单。这是HTML应用程序的一个功能,它只是提供了一种执行上述POST的方法。
扩展这个理论,拥有多个编辑表单是完全可以接受的,这些表单都会POST到定义的RESTful URL。由于控制器的edit
操作通常会使用.attributes = ...
来批量分配它传递的内容,因此您可以查看传入的属性,以及有关用于提交表单的HTML按钮的信息,以确定用户应该看到的页面。
依靠一种控制器方法来处理多个页面的提交可能会很吓人,但通过巧妙的验证和有选择地覆盖访问者,您可以对用户访问应用程序的方式保持很大的控制。
< / LI>您还应该能够确定此方法不会将用户限制为仅按表单中显示的顺序发送属性。理论上,另一个RESTful客户端可以对与资源关联的所有属性进行POST更新,而不仅仅是向导的一个页面提供的属性。假设您的模型方法足够稳健,可以将所有内容都设置为Just Work。
答案 1 :(得分:0)
答案 2 :(得分:0)
您可能希望使用aasm这完全符合您的要求。