2010-10-06 24 views
5

In Schienen, wenn ein Modell zu aktualisieren, wie verhindern Sie bestimmte Eigenschaften des Modells aus aktualisiert werden, wenn ein Anruf wie mit:Verhindern, dass bestimmte Eigenschaften aktualisiert werden?

@user.update_profile params[:user] 

Da jemand eine Formulareingabe mit einem Namen wie ‚Passwort‘ nur erstellen , wie können Sie die Eigenschaften, die Sie zulassen, aktualisierbar sein?

Ist das was attr_XXX ist?

+1

Whitelist vs schwarze Liste zugeordnet ist, wird Whitelist empfohlen. – Swanand

Antwort

6

Sie suchen nach attr_accessible. Sie können angeben, welche Attribute durch Massenaktualisierung festgelegt werden können (z. B. update_attributes), aber Sie können die Attribute weiterhin "manuell" festlegen (z. B. @user.attribute = ...).

Weitere Informationen finden Sie unter The importance of attr_accessible in Ruby on Rails.

+0

ok damit das Massenupdates bei Formular-Posts etc. verhindern wird oder? – Blankman

+0

@Blankman Korrekt, alle Attribute, die nicht als barrierefrei gekennzeichnet sind, können nicht über 'params' aktualisiert werden. –

4

Sie suchen nach Attr_Schutz, um alle Attribute, die nicht in einem Bulk-Update geändert werden sollen, in die schwarze Liste aufzunehmen. Werfen Sie es in Ihr Modell und geben Sie ihm eine Liste der Attributsymbole zur Blacklist.

class User < ActiveRecord::Base 
    attr_protected :password 
end 

Alternativ können Sie attr_accessible verwenden, um die weiße Liste Ansatz zu nehmen und nur die angegebenen Attribute können aktualisiert werden, wenn die gesamte Aufzeichnung auf einmal aktualisieren. Jedes andere Attribut wird geschützt.

N. B Geschützte Attribute noch überschrieben werden können, wenn sie direkt an, wie in

@user.password = "not secure" 
+2

Beachten Sie, dass 'attr_protected' und' attr_accessible' (die ich in meiner Antwort erwähnt habe) zwei Seiten derselben Medaille sind. 'attr_accessible' lässt Sie die Attribute auflisten, die ** Sie wollen ** bulk updateable haben; 'attr_protected' listet die Attribute auf, die ** Sie nicht möchten **, um aktualisierbar zu sein. –

+0

Mit 'attr_accessible' müssen Sie jedoch, wenn Sie Ihrem Modell mehr Attribute hinzufügen, keine Angst haben, dass sie zugänglich sind, wenn Sie sie nicht als solche angeben. Mit 'attr_protected' sind alle neuen Attribute zugänglich. Natürlich hängt die richtige Antwort davon ab, was Sie erwarten (obwohl einige Leute denken, dass es vorzuziehen ist, explizit aufzuführen, was Sie wollen, damit es keine Überraschungen gibt). –

+0

@Daniel Vandersluis: Ja Das stimmt. White Listing mit attr_accessible ist eine viel bessere Sicherheitsstrategie als Blacklist mit attr_protected. Aber die Art, wie die Frage formuliert wurde, implizierte den Ansatz der Schwarzen Liste. – EmFi

Verwandte Themen