0

我的Tag模型对属性进行了一些验证name。在所有其他情况下都可以正常工作。但是当我这样打电话时find_or_create_by_name

# The last value of this string (by coma) is empty.
# So this record should not be saved.
tags_line = 'ruby, javascript, '

tags_line.split(',').each do |tag_name|
  tag = Tag.find_or_create_by_name(tag_name.strip) do |new_tag|
    new_tag.update_attribute :user_id, member.user.id
  end

  # Just append tag to this model
  # through `has_and_belongs_to_many :tags`
  tags << tag if tag
end

但是这个空标签甚至被保存了。那么,这段代码可能有问题吗?

注意:当我删除块时,它可以工作:

...
tags_line.split(',').each do |tag_name|
  # This way, invalid tag will not be created.
  tag = Tag.find_or_create_by_name(tag_name.strip)
  tags << tag if tag
end
4

3 回答 3

1

:name问题是由于属性在模型中受到保护的事实引起的。因此,正如 Rails Doc 所说:

如果对象尚不存在,则可以使用相同的动态查找器样式来创建对象。这个动态查找器是用 find_or_create_by_ 调用的,如果对象已经存在则返回,否则创建它,然后返回它。除非它们在块中给出,否则不会设置受保护的属性。

固定代码是...

tags_field.split(',').each do |tag_name|
  tag_name.strip!

  tag = General::Tag.find_or_create_by_name(tag_name) do |new_tag|
    # :name is attr_protected
    new_tag.name = tag_name
    new_tag.user_id = member.user.id
  end

  tags << tag if tag
end
于 2012-04-19T19:11:27.570 回答
1

或者如果您宁愿跳过该块,您可以使用以下类型的方法链接

tags_field.split(',').each do |tag_name|
  tag_name.strip!

  tag = General::Tag.find_or_create_by_name_and_user_id(tag_name, member.user.id)

  tags << tag if tag
end
于 2012-08-02T15:26:57.830 回答
0

在最后一个迭代标签中有字符串'',即一个空格。

尝试

 tags << tag unless tag.strip.blank?

只要您使用 Ruby On Rails,我怀疑它是空白的吗?是一个导轨扩展。别的

 tags << tag unless tag.strip.empty?

编辑:

update_attribute 不运行验证。看到这个

于 2012-04-19T16:09:05.190 回答