每个帖子限制用户为1喜欢/不喜欢

时间:2014-02-06 14:08:02

标签: ruby-on-rails iteration

我有一个列表模型(允许评论),用户可以喜欢(竖起大拇指)或不喜欢(大拇指向下)列表。它目前有效,但我想迭代特定列表的喜欢,如果有任何类似的user_id listing.likes.user_id匹配当前用户ID current_user.id,那么删除表单(用户可以添加原因)为什么他们喜欢上市)

<%= form_for([@listing, @listing.likes.build]) do |f| %>
<%= f.hidden_field :user_id, :value => current_user.id %> 
<%= f.text_field :body %>
<%= f.submit %>
<% end %>

我有一半在那里检查当前是否喜欢user_id与当前用户ID匹配,如果是,则提供删除(删除/不同)之类的链接。

<% if current_user.id == like.user_id %>
<%= link_to '[ Delete Like ]', [like.listing, like],
           method: :delete,
           data: { confirm: 'Are you sure?' } %>
           <% end %>

如果用户已经创建了类似/如果用户的ID与为特定列表创建的类似user_id匹配,那么如何使用代码删除相似的表单(这样的话?)

<% if current_user.id == listing.likes.any.user_id %>
<% else %>
<%= form_for([@listing, @listing.likes.build]) do |f| %>
<%= f.hidden_field :user_id, :value => current_user.id %> 
<%= f.text_field :body %>
<%= f.submit %>
<% end %>
<% end %>

2 个答案:

答案 0 :(得分:0)

找到了部分解决方案,但它会阻止用户在评论后发表评论,而不是每个评论发表评论。

<% @listing.likes.each do |like| %>
    <% if current_user.id == like.user_id %>
    <% else %>
        <%= form_for([@listing, @listing.likes.build]) do |f| %>
            <%= f.hidden_field :user_id, :value => current_user.id %>
            <%= f.text_field :body %>
            <%= f.submit %>
        <% end %>
    <% end %>
<% end %>

答案 1 :(得分:0)

我认为你对any方法有正确的想法,但没有正确使用它。 any可以接受您可以进行user_id比较的区块,如下所示:

<% if listing.likes.any{|like| like.user_id == current_user.id } %>

在这种情况下,any将在块中的条件评估为真的瞬间返回true。

让我知道这是否有效。

旁注

如果我的方法适合您,您可以通过将该检查作为辅助方法移至Listing模型来进一步清理视图代码。像这样:

class Listing < ActiveRecord::Base
    # ... other stuff

    def has_comment_from?(target_user)
        likes.any{|like| like.user_id == target_user.id }
    end
end

然后你可以简单地从视图中调用它:

<% if listing.has_comment_from? current_user %>