繁体   English   中英

使用新控制器使Rails应用程序干燥

[英]DRY'ing up rails app with a new controller

我正在通过为大学项目开发​​一个应用程序来学习Rails,该应用程序基本上是SO副本。 考虑以下路线:

resources :questions do
  resources :answers
  post :vote_up, :vote_down, :on => :member
end

resources :answers do
  post :vote_up, :vote_down, :on => :member
end

尽管这很好,但我敢肯定这不是最好的方法。 我在两个控制器的vote_upvote_down操作之间有很多重复的代码。 我的规格也有很多重复之处。

我想知道如何以最干燥的方式解决这个问题。 我猜需要一个VotesController ,但是我玩了路由并且没有得到实际的解决方案。 我得到的只是一些大的URL,而不是我真正希望的。

能给我指出正确的方向吗?

听起来您正在描述一个vote_controller ,它可以沿任一方向进行表决,而不是上下拆分为自己的控制器。

关于将上下表决权分成自己的控制器,要问的问题是它们之间有何不同。 如果您有一个vote_upvote_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他们可以调整而不是影响模型级别的投票对象),而无需进行任何更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM