Rails数组不会删除它应该的元素

时间:2014-04-04 03:19:21

标签: ruby-on-rails ruby ruby-on-rails-4

我试图在我的rails应用中为我的Post模型实现标记功能。我目前正在通过逻辑来允许用户添加以逗号分隔的值列表,然后我解析它们并为每个值创建Tag记录。

create方法运行正常,但现在我正在尝试创建逻辑,因此当用户更新Post的标记时,它实际上会添加并删除任何已更新的标记。

我有下面的逻辑,但我的数组current_tag_names似乎没有正确更新。

我尝试的方案是用户使用标签" One"和" Two"创建帖子,然后更新帖子并添加标签"三个"和"四",但在保存帖子时,它实际上删除了标签" One"和" Two"什么时候不应该。此行似乎无法正常工作current_tag_names - [tag],因为在执行它之后,current_tag_names仍然包含["一个","两个"]。

# Returns 2 tag objects with the names being "one", "two"
db_tags = Tag.where(:post_id => @post.id)

# current_tag_names = ['one', 'two']
current_tag_names = []

# Loop through the db_tags and put just the "name" into an array called current_tag_names
db_tags.each do |db_tag|
   current_tag_names << db_tag.name
end


p "current_tag_names before loop = #{current_tag_names}"  # Verify current_tag_names actually contains ["one", "two"]

tags.each do |tag|

      if current_tag_names.include?(tag)
        p "inside if before #{current_tag_names}"
        current_tag_names - [tag]  # The first time through the loop, this line should remove "one" so that current_tag_names only contains "two" RIGHT??? 
        p "inside if after #{current_tag_names}"
      else
        Tag.create(:name => tag.strip, :post_id => @post.id)
      end

    end
  p "current_tag_names after loop = #{current_tag_names}" # STILL CONTAINS ["one", "two"] here. WTF??
  Tag.where(:name => current_tag_names).where(:post_id => @post.id).destroy_all

我使用的是ruby 2.0.0p247和rails 4.0.0。这是其中任何一个的错误,还是我做错了什么?

3 个答案:

答案 0 :(得分:2)

您的逻辑中的问题是您没有修改current_tag_names。试试这个:

current_tag_names = current_tag_names - [tag]

答案 1 :(得分:2)

这一行有一个问题:

current_tag_names - [tag]

减法方法不会修改接收器。相反,它返回一个新数组,该数组是接收器减去参数的结果。由于您未重新分配current_tag_names,因此该变量实际上并未发生变化。

这里有几个选项:使用 修改接收器的方法,例如delete

current_tag_names.delete(tag)

...或者只是将其分配给减法的结果:

current_tag_names = current_tag_names - [tag]

答案 2 :(得分:1)

在你current_tag_names - [tag]之后,它看起来并不像你存储它。尝试:

current_tag_names = current_tag_names - [tag]