2012-04-19 6 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 

しかし、この空のタグにも保存されています。だから、このコードで何か間違っている可能性がありますか?私はブロックを削除すると、それが動作:

NOTE最後の反復タグで

... 
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のドキュメントとして書かれています:

それは が存在しない場合と同じ動的ファインダースタイルは、オブジェクトを作成するために使用することができます。この動的ファインダは 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

は '' 文字列を持っている、それは、空白です。

は、限り、あなたは私がブランクとして、容疑者のRubyでRailsの、で作業しているよう

tags << tag unless tag.strip.blank? 

を試してみてください?レール延長部です。 エルス

tags << tag unless tag.strip.empty? 

編集:

update_attributeの検証を実行しません。 this

+0

それは空の値のために働くことをスキップする場合は、連鎖方式の次のタイプを使用することができ、フォーマット、長さなどを検証したいのですが、この問題の根本を探し、繰り返し検証を避けています。 Tks –

+0

あなたは正しいです、申し訳ありません。あなたの質問を誤解しました。私はそこにいくつかの情報を追加しました – Christian

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 
関連する問題