ActiveRecord: Wie erhalte ich alle Attribute eines Modells, die massenweise zugewiesen werden können?

74

Ich hätte gerne eine Liste aller Attributnamen, die massenweise zugewiesen werden können. Ich benötige dies für einen benutzerdefinierten Formular-Generator, der standardmäßig keine Eingabefelder hinzufügt, denen keine Massenzuweisung zugewiesen werden kann.

Zum Beispiel, wenn ich folgendes Modell habe:

class Post < ActiveRecord::Base
  attr_protected :account

  belongs_to :author

  validates_presence_of :title, :author
end

Ich hätte gerne als Ergebnis [:author, :title].

Vincent
quelle

Antworten:

99

Post.accessible_attributes würde dies abdecken, wenn Sie attr_accessible explizit definiert hätten

Abgesehen davon ist es klobig, so etwas zu tun, aber es funktioniert:

Post.new.attributes.keys - Post.protected_attributes.to_a
Semanticart
quelle
Wenn also access_attributes diejenigen erhält, die explizit attr_accessible'd sind, und protected_attributes diejenigen, die explizit attr_protect'd sind, gibt es eine Methode, die Ihnen sagt, auf welche zugegriffen werden kann, unabhängig davon, ob sie durch attr_protected oder attr_accessible geschützt sind?
Chris Drappier
Vielen Dank für die Veröffentlichung. Dies war eine großartige Ergänzung zu meiner Filterattributmethode.
Kirk
4
Es gibt ein Problem, dies wird auflisten: created_at ,: updated_at als zugängliche Attribute !!, sie sind nicht
MhdSyrwan
3
@MhdSyrwan: Bist du sicher, dass du nicht sagst, dass: created_at und: updated_at SHOULDN'Tstatt zugänglich sind ARE NOT? Wenn Sie eine Eingabe mit name = "post [created_at]" und value = "01/01/2012" übergeben, geht sie nicht an das Modell? hier tut es. Hängt von Ihrer Rails-Version ab (Rails Core ändert die Standardeinstellungen nach dem Skandal um Github / zugängliche Attribute).
Breno Salgado
1
@BrenoSalgado: Sie haben Recht :), es hängt von der Schienenversion chrisroos.co.uk/blog/…
MhdSyrwan
80

Einige der zuvor genannten Antworten gelten möglicherweise nicht für Rails 4.

Sie können verwenden MyModel.attribute_names, um das Array der Tabellenattribute abzurufen. Dies führt jedoch möglicherweise nicht zu massenzuweisbaren Attributen, da sich dieser Aspekt von Rails mit Version 4 ändert. Http://weblog.rubyonrails.org/2012/3/21/strong-parameters /.

Victor S.
quelle
2
das brauchte ich danke. Ich hacke herum, um die Massenzuweisung nur für ein Modell zu deaktivieren. :-)
NullVoxPopuli
25

Benutz einfach

Post.accessible_attributes

Dadurch werden alle Attribute zurückgegeben, auf die die Klasse zugreifen kann

Antoine
quelle
1
Beachten Sie, dass , wenn mehrere Rollen verwenden, können Sie Ihre verschiedenen Listen , indem man das Symbol erhalten - Post.accessible_attributes(:user), Post.accessible_attributes(:admin)etc. Ich habe auch gefunden Post.active_authorizershilfreich, es gibt einen Hash aller definierten Rollen und deren Attribute zugänglich.
Elliot Nelson
Welche Version von Ruby verwenden Sie?
Antoine
1
Verwenden von Ruby 2.2.2; Schienen 4.1.2: Ich habe ein UserModell, das von einer Datenbanktabelle unterstützt wird. Denn User.accessible_attributesich bekommeNoMethodError: undefined method "accessible_attributes" for #<Class:0x007f9216346fe8>
Sameers
Meine Schienen Version 4.2.6 aber es gibt Fehler zurück. Aber die Antwort von @Scudelletti funktioniert.
Pinguin
20

Für Modelle können Sie MyModel.attribute_namesoder verwenden MyModel.column_names.

Für Instanzen können Sie verwenden MyModel.new.attribute_names.

Scudelletti
quelle
1

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

Rajesh Paul
quelle
3
Eine kleine Erklärung wäre besser.
Abdullah Khan
Aus der Überprüfungswarteschlange: Darf ich Sie bitten, Ihrer Antwort einen weiteren Kontext hinzuzufügen. Nur-Code-Antworten sind schwer zu verstehen. Es wird sowohl dem Fragesteller als auch zukünftigen Lesern helfen, wenn Sie Ihrem Beitrag weitere Informationen hinzufügen können.
help-info.de