如何组织不适合普通MVC的操作

时间:2010-07-30 06:06:07

标签: ruby-on-rails model-view-controller

我正在创建一个调查应用程序,因此我创建了一个调查控制器,它可以非常安静地创建,更新等调查。然而,现在我正在添加其他行动,比如“采取”,进行调查,以及“分享”,以便分享调查。还有更多的行动。我开始怀疑我是否应该以不同的方式组织我的代码并将这些新动作移动到他们自己的控制器中,但是我不太确定采取或分享或者我的其他一些操作非常适合REST。如果我对测量控制器的大小没有一点担心,它们几乎可以作为行动更有意义。

要么我可以保持它的原样,要么我正在考虑创建一个调查命名空间并创建像Survey :: TakeController和Survey :: ShareController。然后,我想我会使用新的动作或索引?

我不确定这样做的正确方法。如果我确实创建了一个调查命名空间,那么我应该将原始SurveyController移入其中吗?这会产生一些奇怪的方法,如survey_survey_path。

2 个答案:

答案 0 :(得分:5)

为了思考REST,您应该停止将它们视为“具有操作的控制器”并开始将它们视为“可以创建/更新的对象等” - 控制器只是显示创建结果的视图的代理/更新对象。

很多时候,我发现额外的动作实际上只是“更新”的变体 - 只是有自己的特殊要求(例如,只有某些人可以更新它或其他)。这种逻辑通常可以进入模型本身(例如“MyModel#can_be_edited_by?(some_user)”)。

有时你会发现实际上你有一个额外的“隐藏”模型需要它自己的RESTful接口。

例如,你的“接受”调查 - 我猜,但你所拥有的是像“SurveyResult”,一个人可以“创建”调查“但当他们”接受“一项调查时,他们实际上正在创建一个“SurveyResult”(另一个评论员称之为“SurveyParticipation” - 但它也是一样的。)

事情是你可能有多个SurveyResults,每个属于_to:survey和belongs_to:some_user_model。

然后你可以设置好的休息路线,例如:     /调查/ 123-my_favourite_colour /结果

将返回一组调查的所有结果

这实际上是查看对象空间的这一部分的RESTful方式。

关于分享调查 - 这是一个更有趣的问题。这取决于您如何获得“共享”的授权设置。它还取决于你所说的“分享”。 您是在分享调查结果,还是共享调查对象本身(以便其他用户可以编辑问题),或者您(作为刚刚参与调查的人)共享调查链接,以便您朋友还可以参加调查吗?

对于上面的前两个 - 我会考虑一个属于[survey:]调查和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

提供以下路线:

new_survey_path
surveys_path
new_survey_result_path(@survey)
survey_results_path(@survey)

答案 1 :(得分:1)

如果您希望继续使用RESTful方法,则可以拥有SurveyParticipation资源,并在有人进行调查时调用new / create个操作。并且,ahem,SurveyShare用于分享调查的资源。这个名字虽然很尴尬!

就个人而言,如果你不得不用少量额外的动作来扩充你现有的控制器,我认为这不是世界末日,只要它不会失控。当控制器有数十个动作时,RESTful Rails将我们从过去的糟糕日子中拯救出来。