Unterschied zwischen attr_accessible und starken Parametern

7

Ich habe gerade ein wenig über attr_accessor , attr_accessible und starke Parameter an einigen verschiedenen Orten gelesen:

Unterschied zwischen attr_accessor und attr_accessible
Wie wird attr_accessible in Rails 4 verwendet? Ссылка

Und ich betrachte die Massenzuweisung:

Ссылка

Ich kann den Unterschied zwischen attr_accessible und starken Parametern nicht verstehen. Ich bin nicht zu 100% zuversichtlich in mein Verständnis der oben genannten Themen, so dass ich etwas einfaches vermissen könnte, aber ich weiß, dass sie eine ähnliche Arbeit machen.

Was ist jedoch der Unterschied zwischen attr_accessible und starken Parametern? Sind sie nur ein anderer Name für die gleiche Sache? Warum sind wir von einem zum anderen gegangen?

Jede Information ist willkommen.

    
Adrian Mann 11.06.2015, 15:17
quelle

2 Antworten

15

attr_accessible wurde in Rails 4 zugunsten von Strong Parameters abgelehnt.

Beide sind unterschiedliche Ansätze für das Problem der Massenzuordnung, aber Strong Parameters ist flexibler.

Im Beispiel haben Sie ein User Modell mit den Attributen email:string und is_admin:boolean . Sie möchten den Benutzern erlauben, ihre E-Mails über ein Formular, aber nicht das Feld is_admin zu ändern.

In Rails 3 sollten Sie Folgendes tun:

%Vor%

Mit diesem Ansatz ist es einem Benutzer nicht möglich, is_admin zu ändern, da dieses Attribut geschützt ist.

Eine der guten Eigenschaften von Strong Parameters ist, dass Sie in Ihrem Controller Folgendes tun können:

%Vor%

Auf diese Weise kann ein Admin-Benutzer is_admin ändern, während dies bei einem normalen Benutzer nicht möglich ist.

Dies ist nur ein Beispiel und nicht die beste Möglichkeit, einem Benutzer administrative Berechtigungen zu erteilen, aber dies ist sehr illustrativ.

Der Hauptvorteil von Strong Parameters besteht darin, dass sie im Controller definiert sind und dynamisch zur Laufzeit zugewiesen werden können. attr_accessible war eine eher statische und monolithische Methode, um Whitelist-Attribute zu erstellen.

Andererseits ist attr_accessor eine völlig andere Sache und kann immer noch in Rails 4 verwendet werden, wenn Sie zum Beispiel ein Attribut in Ihrem Modell brauchen, das nicht persistent ist oder in die Datenbank geschrieben werden muss, aber Sie es benötigen eine Form. Denken Sie darüber nach:

attr_accessor :has_accepted_legal_terms

Es ist eine Ruby-Methode, die verwendet werden kann, um ein Attribut Ihres Modells zu deklarieren, das nicht mit der Datenbank verwandt ist, ein Attribut einer Klasse oder eines PORO (einfaches altes Ruby-Objekt).

    
CV-Gate 11.06.2015, 17:08
quelle
5

Strong-Parameter und attr_accessible sind zwei verschiedene Möglichkeiten, der "Massenzuweisung" von Rails Sicherheitsfunktionen hinzuzufügen . Strong Parameters ist der Weg, der von der aktuellen Version von Rails vorgeschrieben wird.

"Massenzuweisung" ist eine praktische Abkürzung in Rails, mit der Sie viele Eigenschaften eines Modells in einer einzigen Anweisung festlegen können.

Stellen Sie sich zum Beispiel vor, Sie hätten eine @user , die Sie mit Daten aus einer Formularübergabe aktualisieren möchten. Ohne Massenzuweisung müßtest du langweiligen Code schreiben:

%Vor%

Und weiter und weiter für jedes Formularfeld.

Bei der Massenzuweisung wird der gesamte Code zu einer einzelnen Zeile:

%Vor%

Aber dies ist voller Sicherheitslücken. Da params alle Daten enthält, die vom Browser übermittelt wurden, könnte ein böswilliger Benutzer der Nachricht Daten hinzufügen, die Sie nicht erwartet haben. Zum Beispiel könnten sie is_admin=1 zu den Parametern hinzufügen. Wenn Sie eine is_admin -Datenbankspalte haben, kann der Benutzer durch die Massenzuweisung nur auf einen Administrator upgraden. Huch!

Hier kommt Strong Parameters ins Spiel. Mit Strong Parameters erhöht Rails einen ActiveModel::ForbiddenAttributesError , wenn du versuchst, den naiven update(params[:user]) zu machen. Stattdessen müssen Sie explizit angeben, welche Parameter Sie von der Browserübermittlung erwarten, indem Sie die von Strong Parameters bereitgestellten Helfer require und permit verwenden. So:

%Vor%

Ich kann nicht für die Betreuer von Rails sprechen, aber ich mag Strong Parameters, weil es flexibel ist. Wenn ich im Benutzer-Controller mehrere Aktionen habe, die unterschiedliche Parameter erwarten, kann ich mit permit einfach die Parameter beschreiben, die erlaubt sein sollten.

Oder wenn ich verschiedene Benutzerrollen habe, die verschiedene Attribute aktualisieren dürfen, kann ich diese Berechtigungen leicht modellieren. Wie bei @ CV-Gate erwähnt, können Sie diese Berechtigungen sogar zur Laufzeit ändern, was ein mächtiger ist.

Kurz gesagt, die Flexibilität von Strong Parameters ist darauf zurückzuführen, dass Sie die user_params -Methode beliebig und beliebig definieren können. Sie haben die volle Leistungsfähigkeit von Ruby und OO-Konzepten, damit es so funktioniert, wie Sie es wollen.

Was ist mit attr_accessible ?

Ohne zu sehr ins Detail zu gehen (da diese Funktion von Rails nicht mehr unterstützt wird): Statt die permit -Methode zu verwenden, würden Sie etwas ähnliches tun, indem Sie ein attr_accessible -Makro im Modell selbst verwenden:

%Vor%

In einfachen Fällen funktioniert es sehr ähnlich wie bei starken Parametern; Sie definieren nur die Liste der Attribute an einem anderen Ort.

Da jedoch attr_accessible stark an die Definition der Modellklasse gekoppelt ist, verlieren Sie viel Flexibilität. Was ist, wenn Sie zwei verschiedene Controller-Aktionen haben, die eine Massenzuweisung für dasselbe User -Modell durchführen müssen? Jetzt bist du fest.

attr_accessor

Das Makro attr_accessor ist in Ruby integriert und hat nichts mit Rails, Massenzuweisung oder Sicherheit zu tun. Es hat zufällig einen ähnlichen Namen. :)

    
Matt Brictson 11.06.2015 19:28
quelle