Ruby on rails 在添加两次的标记上充当标记
我有一个RoR应用程序,允许用户标记其收藏中的项目。我使用tag-it.js Jquery插件,并使用Ajax调用在ItemsController中添加和删除标记。我的问题是,每个标签都添加了两次,因此当我添加@item.tags.each时,所有标签都会显示两次 项目控制器:Ruby on rails 在添加两次的标记上充当标记,ruby-on-rails,ruby-on-rails-3,tags,acts-as-taggable-on,tag-it,Ruby On Rails,Ruby On Rails 3,Tags,Acts As Taggable On,Tag It,我有一个RoR应用程序,允许用户标记其收藏中的项目。我使用tag-it.js Jquery插件,并使用Ajax调用在ItemsController中添加和删除标记。我的问题是,每个标签都添加了两次,因此当我添加@item.tags.each时,所有标签都会显示两次 项目控制器: def add_tag @collection = current_user.collections.find(params[:collection_id]) @item = @collec
def add_tag
@collection = current_user.collections.find(params[:collection_id])
@item = @collection.items.find(params[:id])
@item.tag_list.add(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
def remove_tag
@item = current_user.items.find_by_id(params[:id])
@item.tag_list.remove(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
$('#item_tags').tagit({
onTagAdded: function(event, tag) {
var add_url = $('#item_tags').attr("data-add-url");
$.ajax({
url: add_url,
data: {tag: tag.text().substring(0, tag.text().length-1)},
})
},
onTagRemoved: function(event, tag) {
var remove_url = $('#item_tags').attr("data-remove-url");
$.ajax({
url: remove_url,
type: 'DELETE',
data: {tag: tag.text().substring(0, tag.text().length-1)},
})
},
tagSource: function(search, showChoices) {
var autocomplete_url = $('#item_tags').attr("data-auctocomplete-url");
$.ajax({
url: autocomplete_url,
data: {term: search.term},
success: function(choices) {
showChoices(choices);
}
})
}
});
使用Tag it.js处理AJAX标记的Javascript:
def add_tag
@collection = current_user.collections.find(params[:collection_id])
@item = @collection.items.find(params[:id])
@item.tag_list.add(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
def remove_tag
@item = current_user.items.find_by_id(params[:id])
@item.tag_list.remove(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
$('#item_tags').tagit({
onTagAdded: function(event, tag) {
var add_url = $('#item_tags').attr("data-add-url");
$.ajax({
url: add_url,
data: {tag: tag.text().substring(0, tag.text().length-1)},
})
},
onTagRemoved: function(event, tag) {
var remove_url = $('#item_tags').attr("data-remove-url");
$.ajax({
url: remove_url,
type: 'DELETE',
data: {tag: tag.text().substring(0, tag.text().length-1)},
})
},
tagSource: function(search, showChoices) {
var autocomplete_url = $('#item_tags').attr("data-auctocomplete-url");
$.ajax({
url: autocomplete_url,
data: {term: search.term},
success: function(choices) {
showChoices(choices);
}
})
}
});
item#_表单视图,用户在其中添加/删除标记:
<ul id='item_tags' class='tagit' data-remove-url="<%= remove_tag_collection_item_path %>" data-add-url="<%= add_tag_collection_item_path %>" data-auctocomplete-url="/collections/<%=@collection.id %>/items/autocomplete_tag_name">
<% @item.tags.each do |tag| %>
<li><%= tag.name %></li>
<% end %>
</ul>
提前谢谢
注:以下是我如何在ItemsController中实现自动完成的:
def get_autocomplete_items(parameters)
tags = current_user.owned_tags.named_like(parameters[:term])
end
注意页面加载时触发的onTagAdded事件。请参见此处的事件示例
注意页面加载时触发的onTagAdded事件。请参见此处的事件示例 你是对的: 我想问题是我必须将标签添加到标签列表中,然后 然后将标记列表添加到用户项目标记中。我找不到办法 因为当前的_user.tag()方法似乎覆盖了 调用当前_user.tag()时,前面的项会标记,因此我必须 将新标记添加到以前的标记以保留它们
.tag
方法用给定列表覆盖现有标记。因此,如果您想添加新标记,似乎需要将新标记附加到现有标记,然后传入新列表。然而,.tag\u list.add实际上也会创建标记
所以,当你这么做的时候:
@item.tag_list.add(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
tag_list = profile.tag_list // oops!
tag_list.add(tags)
self.tag(profile, with: tag_list, on: :tags)
您确实添加了两次新标记
当我这样做的时候:
@item.tag_list.add(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
tag_list = profile.tag_list // oops!
tag_list.add(tags)
self.tag(profile, with: tag_list, on: :tags)
我正在创建对标记列表的引用,然后调用add。我们需要做的是:
tag_list = profile.tags.map(&:name)
为要标记的对象创建标记名数组。然后我们可以在列表的副本上调用add,没问题!没有更多重复的标签
我很高兴我遇到了你的问题,因为它让我找到了一个对我有用的答案。然而,如果图书馆提供了一种很好的方法,我会更高兴。仅仅通过阅读文档,我无法找到一个好方法。你是对的:
我想问题是我必须将标签添加到标签列表中,然后
然后将标记列表添加到用户项目标记中。我找不到办法
因为当前的_user.tag()方法似乎覆盖了
调用当前_user.tag()时,前面的项会标记,因此我必须
将新标记添加到以前的标记以保留它们
.tag
方法用给定列表覆盖现有标记。因此,如果您想添加新标记,似乎需要将新标记附加到现有标记,然后传入新列表。然而,.tag\u list.add实际上也会创建标记
所以,当你这么做的时候:
@item.tag_list.add(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
tag_list = profile.tag_list // oops!
tag_list.add(tags)
self.tag(profile, with: tag_list, on: :tags)
您确实添加了两次新标记
当我这样做的时候:
@item.tag_list.add(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
tag_list = profile.tag_list // oops!
tag_list.add(tags)
self.tag(profile, with: tag_list, on: :tags)
我正在创建对标记列表的引用,然后调用add。我们需要做的是:
tag_list = profile.tags.map(&:name)
为要标记的对象创建标记名数组。然后我们可以在列表的副本上调用add,没问题!没有更多重复的标签
我很高兴我遇到了你的问题,因为它让我找到了一个对我有用的答案。然而,如果图书馆提供了一种很好的方法,我会更高兴。仅仅通过阅读文档,我无法找到一个好方法。你做得很好,但是,只是一个小错误
这里,tag\u列表
得到了重复的标签,一个有所有者,另一个没有所有者
您的@item.tag\u list.add(params[:tag])
行正在添加没有所有者的标记
和current_user.tag(@item,:with=>@item.tag_list.to_s,:on=>:tags)
line正在添加与所有者相同的标记
稍后,当您保存对象时,由于tag\u list
的行为是对对象的非所有者标记的引用,因此两者都会被保存
以下代码可以正常工作
def add_tag
@collection = current_user.collections.find(params[:collection_id])
@item = @collection.items.find(params[:id])
tag_list = @item.all_tag_list.dup # Reference to original tag_list avoided
# Also instead of "tag_list", use "all_tag_list" method, as "tag_list" only return tags without owner
# Link(go to last line og Tag Ownership topic) : "https://github.com/mbleigh/acts-as-taggable-on#tag-ownership"
tag_list.add(params[:tag])
current_user.tag(@item, :with => tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
def remove_tag
@item = current_user.items.find_by_id(params[:id])
tag_list = @item.all_tag_list.dup # Reference to original tag_list avoided
tag_list.remove(params[:tag])
current_user.tag(@item, :with => tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
改进版
def add_owned_tag
@some_item = Item.find(params[:id])
owned_tag_list = @some_item.all_tag_list - @some_item.tag_list
owned_tag_list += [(params[:tag])]
@tag_owner.tag(@some_item, :with => stringify(owned_tag_list), :on => :tags)
@some_item.save
end
def stringify(tag_list)
tag_list.inject('') { |memo, tag| memo += (tag + ',') }[0..-1]
end
def remove_owned_tag
@some_item = Item.find(params[:id])
owned_tag_list = @some_item.all_tag_list - @some_item.tag_list
owned_tag_list -= [(params[:tag])]
@tag_owner.tag(@some_item, :with => stringify(owned_tag_list), :on => :tags)
@some_item.save
end
你做得很好,但是,只是一个小错误
这里,tag\u列表
得到了重复的标签,一个有所有者,另一个没有所有者
您的@item.tag\u list.add(params[:tag])
行正在添加没有所有者的标记
和current_user.tag(@item,:with=>@item.tag_list.to_s,:on=>:tags)
line正在添加与所有者相同的标记
稍后,当您保存对象时,由于tag\u list
的行为是对对象的非所有者标记的引用,因此两者都会被保存
以下代码可以正常工作
def add_tag
@collection = current_user.collections.find(params[:collection_id])
@item = @collection.items.find(params[:id])
tag_list = @item.all_tag_list.dup # Reference to original tag_list avoided
# Also instead of "tag_list", use "all_tag_list" method, as "tag_list" only return tags without owner
# Link(go to last line og Tag Ownership topic) : "https://github.com/mbleigh/acts-as-taggable-on#tag-ownership"
tag_list.add(params[:tag])
current_user.tag(@item, :with => tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
def remove_tag
@item = current_user.items.find_by_id(params[:id])
tag_list = @item.all_tag_list.dup # Reference to original tag_list avoided
tag_list.remove(params[:tag])
current_user.tag(@item, :with => tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
改进版
def add_owned_tag
@some_item = Item.find(params[:id])
owned_tag_list = @some_item.all_tag_list - @some_item.tag_list
owned_tag_list += [(params[:tag])]
@tag_owner.tag(@some_item, :with => stringify(owned_tag_list), :on => :tags)
@some_item.save
end
def stringify(tag_list)
tag_list.inject('') { |memo, tag| memo += (tag + ',') }[0..-1]
end
def remove_owned_tag
@some_item = Item.find(params[:id])
owned_tag_list = @some_item.all_tag_list - @some_item.tag_list
owned_tag_list -= [(params[:tag])]
@tag_owner.tag(@some_item, :with => stringify(owned_tag_list), :on => :tags)
@some_item.save
end
隐马尔可夫模型。。。我的问题始于我将profile.tag\u list.add(“bob”)
添加到我的控制器代码时,正如您所做的那样。我认为那条线没有必要。没有它,我只有一个标签。有了它,我就有了副本。嗯。。。我的问题始于我将profile.tag\u list.add(“bob”)
添加到我的控制器代码时,正如您所做的那样。我认为那条线没有必要。没有它,我只有一个标签。有了它,我得到了重复的。哈哈,不,这仍然覆盖了现有的标签。。。坚持住,我正在努力!哈哈,不,这仍然覆盖了现有的标签。。。坚持住,我正在努力!