如何允许当前用户使用acts-as-taggable-on删除拥有的标记

时间:2016-01-01 03:12:54

标签: ruby-on-rails acts-as-taggable-on

在我的rails应用程序中,我有一个列出项目标签的项目页面。用户可以向项目添加标签。我希望当前用户能够删除标签,但仅限于当前用户添加到该特定项目的标签。我想通过ajax做到这一点。我为视图制作标记列表的代码如下所示:

<div id="tags">Tags: 
  <% @item.all_tags_list.each do |t| %>
    <span class="tag-container">
      <%= link_to t, tag_path(t) %>
      <% if @item.tags_from(current_user).include?(t) %>
        <span>
          <%= link_to "×", '#' %>
        </span>
      <% end %>
    </span>
  <% end %>
</div>

生成的行看起来像:Tags: tag1 tag2 tag3 x。在这种情况下,当前用户仅将tag3添加到当前项目页面。我希望当前用户能够单击x并从项目中删除tag3。如果当前用户也添加了tag2,则它看起来像Tags: tag1 tag2 x tag3 x

如何设置items_controller完成此操作的路由和方法?我相信它最终会成为:

def remove_tag
  @item = Item.find_by_id(params[:id])
  tag = ????????
  @item.all_tags_list.remove(tag)
  @item.save
  respond_to do |format|
    format.js
  end
end

但是如何在单击x时告诉控制器我要删除哪个标签,以及如何创建路径。在给定页面上可能会有几个标签旁边有一个x。

1 个答案:

答案 0 :(得分:0)

如果您使用类似设计的身份进行身份验证,则控制器中会有current_user方法指向实际登录的用户模型。

然后,如果你有这样的联想:

 class User < ActiveRecord::Base
   has_many :items
 end

 class Item < ActiveRecord::Base
   has_many :tags
 end

您可以使用这些关联来查找属于current_user创建的项目的标记。

像:

 def show
   @item = current_user.items.find(params[item:id])
   @tag = item.tags.find(params[:id])
 end

路线:

 resources :items do
   resources :tags
 end

这只是举例。