2012-04-19 53 views
0

我的Tag模型對屬性name有一些驗證。在其他所有情況下都很好。但是當我通過這種方式撥打find_or_create_by_name`find_or_create_by`方法正在跳過模型驗證。爲什麼?

# 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 

回答

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 
0

在最後一次迭代變量具有字符串「」,也就是一個空白。

嘗試

tags << tag unless tag.strip.blank? 

只要你使用Ruby on Rails的工作,我懷疑,作爲空白?是一個導軌擴展。 否則

tags << tag unless tag.strip.empty? 

編輯:

update_attribute不運行驗證。請參閱this

+0

它可以爲空值工作,但我想驗證格式,長度等。所以我尋找這個問題的根源,避免重複的驗證。 Tks – 2012-04-19 16:29:34

+0

你說得對,對不起。誤解了你的問題。我在那裏添加了更多信息 – Christian 2012-04-19 16:40:28

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