Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在添加两次的标记上充当标记_Ruby On Rails_Ruby On Rails 3_Tags_Acts As Taggable On_Tag It - Fatal编程技术网

Ruby on rails 在添加两次的标记上充当标记

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

我有一个RoR应用程序,允许用户标记其收藏中的项目。我使用tag-it.js Jquery插件,并使用Ajax调用在ItemsController中添加和删除标记。我的问题是,每个标签都添加了两次,因此当我添加@item.tags.each时,所有标签都会显示两次

项目控制器:

  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”)
添加到我的控制器代码时,正如您所做的那样。我认为那条线没有必要。没有它,我只有一个标签。有了它,我得到了重复的。哈哈,不,这仍然覆盖了现有的标签。。。坚持住,我正在努力!哈哈,不,这仍然覆盖了现有的标签。。。坚持住,我正在努力!