听起来您正在描述一个vote_controller
可以在任一方向上进行投票的设备,而不是向上和向下拆分到自己的控制器中。
关于将赞成票和反对票分成自己的控制器,要问的问题是它们有多么不同。如果你有一个vote_up
和vote_down
控制器,他们都必须找到被投票实体的投票,添加一个新的投票,然后存储数据。无论您是投赞成票还是反对票,几乎所有事情都是一样的。事实上,我管理投票的方式是有vote
一个有点像这样的类型:
class Vote
attr_reader :direction, :user, :timestamp
end
这样,单一投票类型可以记录是赞成票还是反对票,以及记录投票者(因此,如果有人在拖钓,您可以一次性撤消他们的所有工作)和投票时间,即总是有用的。
然后,当您调用时,vote_controller.up_vote
您创建一个具有正方向的新Vote
对象,因为vote_controller.down_vote
您创建一个具有负方向的对象。其他一切都是完全常见的,所以你在投票控制器中所拥有的一切都会模糊地像这样:
def vote(direction)
myVote = vote.new(direction, Request.userId, Time.now )
voteOnObject.votes.add(myVote)
end
def up_vote
vote( 1 )
end
def down_vote
vote( -1 )
end
您会注意到这与工作代码完全不同。那部分是因为我不想为你做作业,部分是因为我最近没有做太多的 Ruby,所以我有点吱吱作响。重要的是这里的原则。
如果您想适当地DRY,您还可以将其设计为可以将相同的投票控制附加到问题、答案、评论等(因此它们具有给定类型的父对象/实现给定的 mixin,其投票他们调整而不是影响模型级别的投票对象)而无需进行任何更改。