【发布时间】:2019-11-14 02:07:56
【问题描述】:
我正在与我的一位编程朋友讨论一个模型是否应该能够创建其他模型。我们目前正在尝试创建一个人们可以互相对战的网站。假设我们有一个硬币翻转。这是我的 CoinFlipController 的示例
class CoinFlipsController < ApplicationController
def join
coinflip = CoinFlip.find(params[:id])
participant = coinflip.join(current_user)
end
end
每个硬币翻转可以有 2 名玩家加入。当玩家加入投币时,我们创建投币参与者。我希望控制器在模型 coinflip.join(current_user) 上调用 join。
class CoinFlip < ApplicationRecord
def join(user)
if self.coin_flip_participants.count < 2
participant = CoinFlipParticipant.create(coin_flip: self, user: user, client_seed: user.client_seed, face: :t)
else
raise CoinFlipFull.new("Coin Flip Full")
end
end
但是我的朋友希望我像这样将逻辑放在 CoinFlipController 中,并从模型中删除 join 方法。
class CoinFlipsController < ApplicationController
def join
@coinflip = CoinFlip.find(params[:id])
if @coinflip.coin_flip_participants.count < 2
@participant = CoinFlipParticipant.create(coin_flip: @coinflip, user: current_user, client_seed: current_user.client_seed, face: :t)
else
raise CoinFlipFull.new("Coin Flip Full")
end
end
这给出了相同的结果,但是如果我想让另一个用户从另一个控制器加入,我必须在创建参与者之前实施相同的检查。这些解决方案中的任何一个是正确的还是有不同的解决方案?
【问题讨论】:
-
经验法则:控制器用于在模型和视图之间或视图到模型之间移动数据。模型用于“业务逻辑”。过度填充控制器的时代已经一去不复返了。
-
只是为了非常清楚。当你说“过度填充控制器的时代已经一去不复返了”时,你的意思是你应该像我的第一个例子一样在模型中保留尽可能多的逻辑,还是你不能再在控制器中放太多东西了?
-
考虑使用服务。胖模特。脂肪控制器。脂肪就是脂肪。脂肪不好。
-
@TobiasKnudsen 我的意思是,在几年或更多年前,许多 Rails 开发人员都有不良习惯,会将逻辑塞进控制器中,而 MVC 则要求清晰明确地分离关注点。你的看法更正确。
标签: ruby-on-rails model-view-controller