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

または、ブロックをスキップする場合は、次のタイプのメソッドチェーンを使用できます

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 に答える
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 に答える
0

最後の反復タグには文字列 ' '、つまり空白があります。

試す

 tags << tag unless tag.strip.blank?

Ruby On Rails で作業している限り、私はそれを疑っていますが、空白のままですか? レール拡張です。そうしないと

 tags << tag unless tag.strip.empty?

編集:

update_attribute は検証を実行しません。これを見る

于 2012-04-19T16:09:05.190 に答える