我试图在我的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。这是其中任何一个的错误,还是我做错了什么?
答案 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]