好的,我在文章index.html.erb
中有这个<td><%= pluralize(article.likes.count, "like") %></td>
<td><%= button_to '+1', "/articles/#{article.id}/user/#{current_user.id}/like_vote", method: :post %></td>
但如果选民已经喜欢过一篇文章,我如何阻止该按钮出现在index.html.erb中呢?有没有一种简单的方法可以阻止按钮显示在index.html.erb中?
这是ArticlesController中的方法:
def like_vote
@article = Article.find(params[:id])
@user_id = params[:user_id]
likes = Like.where("user_id = ? and article_id = ?", @user_id, @article.id )
if likes.blank?
@article.likes.create(user_id: current_user.id)
end
redirect_to(article_path)
end
答案 0 :(得分:1)
<%-unless article.voted?(current_user)%>
<td><%= button_to '+1', "/articles/#{article.id}/user/#{current_user.id}/like_vote", method: :post %></td>
<%- end%>
并在文章模型中制作方法
def voted?(user)
self.likes.where(user_id:user.id).first.present?
end
答案 1 :(得分:1)
Rails提供optimal way
即scope
,它是对chainable
和{{1}的数据库交互(例如条件,限制或偏移)的一组约束。 }。
将范围添加到reusable
模型,如下所示:
Like
更新视图如下:
class Like < ActiveRecord::Base
scope :voted_count, ->(user_id, article_id) { where("user_id = ? and article_id = ?", user_id, article_id).count }
end
答案 2 :(得分:0)
您可以在index.html.erb ...
中执行此操作 <td><%= pluralize(article.likes.count, "like") %></td>
<td><%= button_to '+1', "/articles/#{article.id}/user/#{current_user.id}/like_vote", method: :post if article.likes.present? %></td>
只需在最后包含条件语句,它将阻止它执行该行。