初级练习加分题,解决增加减分按钮

Published on:

今天,第二遍练习第二课:初级练习,上午很快的用不到两个小时的时间完成了出加分题以外的练习。

吃完饭,开始解决三道加分题。下面是第一题。

为了增加一个“减分”按钮,做的事情刚好和”加分“相反。

第一步:加一个新的 controller action 来投票减分

修改app/controllers/topics_controller.rb,如下:

app/controllers/topics_controller.rb
def downvote
  @topic = Topic.find(params[:id])
  @topic.votes.create
  redirect_to(topics_path)
end

第二步:给投票减分操作加一个 route

修改config/routes.rb,如下:

config/routes.rb
Rails.application.routes.draw do
 root 'topics#index'
 resources :topics do
   member do
     post 'upvote'
     post 'downvote'
   end
 end
end

第三步:在 view 里面加一个按钮

修改app/views/topics/index.html.erb,如下:

app/views/topics/index.html.erb
<% @topics.each do |topic| %>
  <tr>
    <td><%= topic.title %></td>
    <td><%= topic.description %></td>
    <td><%= pluralize(topic.votes.count, "vote") %></td>
    <td><%= button_to '+1', upvote_topic_path(topic), method: :post %></td>
    <td><%= button_to '-1', downvote_topic_path(topic), method: :post %></td>
    <td><%= link_to 'Show', topic %></td>
    <td><%= link_to 'Edit', edit_topic_path(topic) %></td>
    <td><%= link_to 'Destroy', topic, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

搞掂!打开http://localhost:3000/topics

我去,点击-1,居然加分起来了。

好吧,哪里出错误了呢?

我就想啊,lowdown一定有人记录了相关的问题解决,好吧,那就Google吧。

Google: lowdown ”减分”

果然,第一条找到答案:http://izhanyouxin-blog.logdown.com/posts/1142796

原来,我第一步就出错误了,这个@topic.votes.create

很明显,减分这里应该用destroy这个method。

在这里用last来代替first,因为系统可能识别不出那一笔投票是谁投的,也就不在乎到底是第一笔还是最后一笔投票了。


不过,这里还有一个问题,就是一旦加入了减分按钮,如果这时候在零票的topic右侧点击减分按钮,就会出错,因为系统暂时不知道怎么处理负分。

所以,需要在@topic.votes.first.destroy这里修改一下,加入一个判断@topic.votes.first.destroy if @topic.votes > 0

当然更好的方法是这样修改@topic.votes.first.try(:destroy),感兴趣可以多多去了解一下try这个神奇的功能。

传送门:try

Comments

comments powered by Disqus