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].

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

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 /.


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


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.


1

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.