2014-03-24 69 views
0

好的一個按鈕,我有這樣的文章index.html.erb如何防止出現在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 

回答

1

Rails提供一個optimal wayscope它是一組上的數據庫交互的約束(例如,條件,限制或偏移)是chainablereusable

一個範圍添加到下面Like型號:

class Like < ActiveRecord::Base 
    scope :voted_count, ->(user_id, article_id) { where("user_id = ? and article_id = ?", user_id, article_id).count }  
end 

更新的觀點如下:

<td><%= pluralize(article.likes.count, "like") %></td> 
<td><%= button_to('+1', "/articles/#{article.id}/user/#{current_user.id}/like_vote", method: :post) if Like.voted_count(current_user.id, article.id) == 0 %></td> 
+0

@ user2730725我的答案是否解決了您的問題?讓我知道。 –

+0

是的,它的確如此。謝謝。我真的很喜歡你使用範圍的事實,儘管我不太瞭解它們。他們似乎被用在各地。 – user273072545345

+0

很高興提供幫助。 :)你可以在這裏閱讀關於範圍http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-scope –

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 
+0

我喜歡這個答案。它也可以寫成'self.likes.where(user_id:user.id).exists?' – Baldrick

+0

@Kimooz,謝謝你的回答。非常感謝。 =) – user273072545345

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>

只要在最後包含一個條件語句,它就會阻止它執行該行。

+0

謝謝你的回答。 =)非常感謝。 – user273072545345