私の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
それは空の値のために働くことをスキップする場合は、連鎖方式の次のタイプを使用することができ、フォーマット、長さなどを検証したいのですが、この問題の根本を探し、繰り返し検証を避けています。 Tks –
あなたは正しいです、申し訳ありません。あなたの質問を誤解しました。私はそこにいくつかの情報を追加しました – Christian