2011-10-23 11 views
5

コードは次のとおりです。Mongoid:未定義フィールドが一意の代入によって作成されないようにするにはどうすればよいですか?

class M 
    include Mongoid::Document 
    field :name 
end 

params = { name: "foo", age: 20 } 
M.create(params) 
#=> #<M name: "My Name", age: 20> 

ageは定義されていませんが、保存されています。

悪意のあるユーザーがPOSTでパラメータを追加したり、大きな文字列を使って未知のフィールドを追加したりする可能性があるため、これは問題である可能性があります(例:name=foo&bogus=#{'x'*1000000}

これまでのところ、 attr_accessible以外は何も見つかりませんが、すべてのモデルで、fieldattr_accessibleの両方で同じフィールド名を常に維持しなければならないので、Mongoidにとってはそれほど素晴らしいものではありません。ドライではない。

attr_accessible APIはActiveRecordに最適だと思います。モデル(DRY)とのフィールドを明示的に定義していないb。これは、存在しないフィールドがRDBに保存されることはないことが保証されています。しかし、モンゴイドにとって、私はattr_accessibleよりも良い解決策があるはずだと思います。

グローバル設定にはallow_dynamic_fieldsを設定していることに注意してください。しかし、これはマス割り当てに関するものではありませんので、このディスカッションの範囲外ですが、実際にはモデルごとのマクロでなければならないと思います。

どのようにこの問題に対処していますか?

+1

この解決策を見つけましたか?私も同じ問題に直面しています。 – Rohit

答えて

1

モデルでは常にattr_accessibleを使用しています。私はほとんどすべてのフィールドをアクセス可能なものとして含めていることはほとんどありませんでした。通常、大量の割り当てにはアクセスできないフィールドがいくつかあります。あなたは、多くの場合、すべての属性を含める必要があり、あなたが重複を懸念している場合:

set_callback(:save, :before) do |doc| 
    (doc.attributes.keys - fields.keys).each { |f| doc.unset(f) } 
end 

この:私は、この問題を解決するためにやっていること

attr_accessible *fields.keys 
0

、私のモデルでは、コールバックを保存する前に使用しています余分な属性があっても保存される前に削除されます。

関連する問題