在我的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。
答案 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
这只是举例。