gpt4 book ai didi

ruby-on-rails - 如何组织不适合正常 MVC 的 Action

转载 作者:行者123 更新时间:2023-12-04 05:44:40 24 4
gpt4 key购买 nike

我正在创建一个调查应用程序,所以我创建了一个调查 Controller ,它可以非常轻松地创建、更新等调查。但是现在我正在向它添加其他操作,例如“接受”,用于进行调查,以及“分享”,用于共享调查。还有更多的 Action 。我开始怀疑我是否应该以不同的方式组织我的代码并将这些新 Action 移动到它们自己的 Controller 中,但是我不太确定采取或分享,或者我的其他一些 Action 真的很适合 REST。如果我不太担心调查 Controller 的大小,它们作为行动几乎更有意义。

要么我可以保持原样,要么我正在考虑创建一个调查命名空间并创建类似的 Survey::TakeController 和 Survey::ShareController。那么我猜我会使用新的操作或索引吗?

我不完全确定正确的方法。如果我确实创建了一个调查命名空间,我应该将原始的 SurveyController 移动到其中吗?这会产生一些看起来很奇怪的方法,比如survey_survey_path。

最佳答案

要以 REST 的方式思考,您可能应该停止将它们视为“具有操作的 Controller ”并开始将它们视为“可以创建/更新的对象等”—— Controller 只是显示创建/更新结果的 View 的代理目的。

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

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

例如,您的“进行”调查-我猜,但是您拥有的是类似于“SurveyResult”的东西,一个人可以“创建”“调查”,但是当他们“进行”调查时,他们实际上是在创建“SurveyResult” ”(另一位评论员称其为“SurveyParticipation”——但它是同一件事)。

问题是您可能会有多个 SurveyResults,每个属于:survey 和属于:some_user_model。

然后你可以设置好安静的路线,例如:
/surveys/123-my_favourite_colour/results

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

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

至于分享调查 - 这是一个更有趣的问题。这取决于您如何获得“共享”的授权设置。这也取决于您所说的“分享”是什么意思。
您是共享调查结果,还是共享调查对象本身(以便其他用户可以编辑问题),还是您(作为刚刚参加调查的人)共享调查链接,以便您的 friend 也可以参加调查吗?

对于上面的前两个 - 我会考虑一个“SurveyPermission”类,它是 belongs_to :survey 和 belongs_to :some_user_model。
您可以为另一个用户创建一个 SurveyPermission - 并且调查可以由创建者编辑 - 或任何有权编辑它的人。
因此,共享操作是创建一个 SurveyPermission。
虽然说实话 - 您的 SurveyPermission 可能仅用于创建和删除,因此将这两个操作粘贴在 Survey Controller 中可能更简单。

对于后者 - 好吧,这只是向某人发送“create_survey_result(@survey)”链接......

更新:

除非有两个资源名称相同(但在不同的上下文中),否则我通常不会使用 namespace 。您只需要命名空间来消除它们之间的歧义,而这里似乎并非如此。

在这种情况下 - 唯一发生的命名空间是在路由中:

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)

关于ruby-on-rails - 如何组织不适合正常 MVC 的 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3369029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com