2009-10-06 3 views
57

大量割り当て可能なすべての属性名のリストが必要です。大量に割り当てることができない入力フィールドをデフォルトで追加しないカスタムフォームビルダーには、これが必要です。たとえば、次のようなモデルがあるとします。一括割り当て可能なアクティブレコードモデルの属性一覧を取得する方法

class Post < ActiveRecord::Base 
    attr_protected :account 

    belongs_to :author 

    validates_presence_of :title, :author 
end 

私は結果として、author、:titleというリストを持っています。

このような方法が存在するかどうかはご存知ですか?あるいは、私がこれを行う方法を作るためのガイドライン?あなたが明示的にバーリングattr_accessible

を定義した場合

答えて

89

Post.accessible_attributesはこのような何かをやっては不格好ですが、働くこと、それをカバーする:

Post.new.attributes.keys - Post.protected_attributes.to_a 
+0

おかげであなたの答えのために@semanticart! – Vincent

+0

だから、もしaccessible_attributesが明示的にattr_accessibleされたものを取得し、protected_attributesが明示的にattr_protectされたものを取得した場合、attr_protectedまたはattr_accessibleによって保護されているかどうかにかかわらず、 –

+0

ありがとうございます。これは、私のフィルタ属性メソッドに大きな追加でした。 – Kirk

22

ちょうどその意志

Post.accessible_attributes 

を使用クラスのすべてattributes accessibleを返す

+1

複数のロールを使用している場合は、 'Post.accessible_attributes(:user)'、 'Post.accessible_attributes(:admin) 'というシンボルを渡すことで別のリストを取得できることに注意してください。 'など、私は' Post.active_authorizers'が役に立ちました。これは定義されたすべてのロールとそのア​​クセス可能な属性のハッシュを返します。 –

+1

リンクが壊れていて、いくつかのレールバージョンでは動作しないようです。 –

+0

ご使用のルビのバージョンは? – Antoine

55

上記の答えのいくつかはRails 4には適用されないかもしれません。

MyModel.attribute_namesを使用してテーブル属性の配列を取得することはできますが、これは大量の割り当て可能な属性を与えることはできません。 http://weblog.rubyonrails.org/2012/3/21/strong-parameters/

+2

これは私が感謝の必要なものです。私はちょうどモデルの質量割り当てを無効にすることについてハッキングしています。 :-) – NullVoxPopuli

13

モデルの場合、MyModel.attribute_namesまたはMyModel.column_namesを使用できます。

たとえば、MyModel.new.attribute_namesを使用できます。

0

Post.accessible_attributes.to_a.map(&:to_sym)

+1

少し説明が良いでしょう。 –

+0

**レビューキューから:**あなたの答えの周りにいくつかの文脈を追加してください。コードのみの回答は理解しにくいです。あなたの投稿にさらに情報を追加することができれば、これはAskerと将来の読者に役立ちます。 –

関連する問題