Rails 初级练习 额外作业:加一个“扣分”按钮, 做的事跟加分按钮相反

一 完成作业思路。
1.修改app/controllers/topics_controller.rb
对照
def upvote
@topic = Topic.find(params[:id])
@topic.votes.create
redirect_to(topics_path)
end
添加
def downvote
@topic = Topic.find(params[:id])
@topic.votes.destroy
redirect_to(topics_path)
end

2.config/routes.rb
在resources :topics do
member do
post 'upvote'
end
end
中添加
post 'downvote'
得到
resources :topics do
member do
post 'upvote'
post 'downvote'
end
end
#解释:
~为什么会想到写“post ‘downvote'”?
原因1:
在app/views/topics/index.html.erb中的代码如下:


原因2,对代码中“method: :post”,解释如下:

3.在app/views/topics/index.html.erb 中

<%= pluralize(topic.votes.count, "vote") %>
<%= button_to '+1', upvote_topic_path(topic), method: :post %>
的后面添加:
<%= button_to '-1', downvote_topic_path(topic), method: :post %>
得到:

4.刷新网页,看结果:


发现点击“downvote"按钮,票数不会减少。

第二部分 发现问题解决问题
思考:应该是topics_controller.rb中def downvote 这部分出了问题。
开始解决问题:
1.去交流论坛看(http://forum.qzy.camp/c/6-category)看大家的讨论情况。
2.尝试论坛中给出的三种解法:
(1)def downvote
@topic = Topic.find(params[:id])
@topic.votes.last.destroy
redirect_to(topics_path)
end
(2)def downvote
@topic = Topic.find(params[:id])
@topic.votes.first.destroy
redirect_to(topics_path)
end
(3)def downvote
@topic = Topic.find(params[:id])
@topic.votes.try(:destroy)
redirect_to(topics_path)
end
3.总结:
(1)第一种喝第二种解法虽然票数会减少,但是但票数减少至0后,继续点击会出现报错,如图:
#方法一报错截图:


#方法二报错截图:

(2)尝试下来,方法三是最棒地!
(3)三种解法思路来源:
#方法一,还没想出来?(欢迎补充)
找到答案了,详细解说请点击链接:
http://qiaoyu-blog.logdown.com/posts/1537057-lesson-plus-ideas-to-solve-math-questions
#方法二,在第二课练习教材中有提及,网页连接和相关内容截图如下:
https://fullstack.xinshengdaxue.com/posts/47


#方法三,完全没想到?(欢迎补充)

Comments

comments powered by Disqus