had*_*ees 5 model-view-controller ruby-on-rails
我正在创建一个调查应用程序,因此我创建了一个调查控制器,它可以非常安静地创建,更新等调查.然而,现在我正在添加其他行动,比如"采取",进行调查,以及"分享",以便分享调查.还有更多的行动.我开始怀疑我是否应该以不同的方式组织我的代码并将这些新动作移动到他们自己的控制器中,但是我不太确定采取或分享或者我的其他一些操作非常适合REST.如果我不太担心调查控制器的大小,它们几乎更有意义.
要么我可以保持它的原样,要么我正在考虑创建一个调查命名空间,并创建像Survey :: TakeController和Survey :: ShareController.然后我会猜测我是否会使用新动作或索引?
我不确定正确的做法.如果我确实创建了一个调查命名空间,那么我应该将原始SurveyController移入其中吗?这会产生一些奇怪的方法,如survey_survey_path.
为了思考REST,您应该停止将它们视为"具有操作的控制器"并开始将它们视为"可以创建/更新的对象等" - 控制器只是用于显示创建/更新结果的视图的代理.宾语.
很多时候,我发现额外的动作实际上只是"更新"的变体 - 只是有自己的特殊要求(例如,只有某些人可以更新它或其他).这种逻辑通常可以进入模型本身(例如"MyModel#can_be_edited_by?(some_user)").
有时您会发现实际上您有一个额外的"隐藏"模型需要自己的RESTful接口.
例如,你的"接受"调查 - 我猜,但你所拥有的是像"SurveyResult",一个人可以"创建"调查"但当他们"接受"调查时,他们实际上正在创建一个"SurveyResult" "(另一位评论员称之为"SurveyParticipation" - 但它也是一样的).
事实上,你可能会有多个SurveyResults,每个属于_to:survey和belongs_to:some_user_model.
然后你可以设置好的休息路线,例如:/ surveys/123-my_favourite_colour/results
这将返回一组调查的所有结果
这实际上是查看对象空间的这一部分的RESTful方式.
至于分享调查 - 这是一个更有趣的问题.这取决于您如何获得"共享"的授权设置.它还取决于你所说的"分享".您是在分享调查结果,还是共享调查对象本身(以便其他用户可以编辑问题),或者您(作为刚刚参与调查的人)共享调查链接,以便您朋友还可以参加调查吗?
对于上面的前两个 - 我会考虑一个属于[调查和belongs_to:some_user_model的"SurveyPermission"类.您可以为另一个用户创建SurveyPermission - 并且创建者或任何有权编辑它的人可以编辑Surveys.因此,共享操作是创建SurveyPermission.虽然说实话 - 您的SurveyPermission可能只用于创建和删除,因此将这两个操作粘贴在Survey控制器中可能更简单.
对于后者 - 嗯,这只是向某人发送"create_survey_result(@survey)"链接......
更新:
我通常不会打扰命名空间,除非有两个资源命名相同(但在不同的上下文中).您只需要命名空间来消除它们之间的歧义,而这似乎并非如此.
在这种情况下 - 发生的唯一命名空间是在路由中:
map.resources :surveys do |s|
s.resources :results
s.resources :shares # ???
end
Run Code Online (Sandbox Code Playgroud)
给出如下路线:
new_survey_path
surveys_path
new_survey_result_path(@survey)
survey_results_path(@survey)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |