2009-06-04 7 views
3

Ich habe eine Frage über die Verwendung von attr_accessible in Rails.Schienen - attr_accessible & Massenzuweisung

Manchmal möchte ich guard_protected_attributes auf false setzen, um den Schutz vor Massenzuweisungen zu umgehen. Ich frage mich, warum die folgende Zeile nicht funktioniert (es die Fehlermeldung „kann nicht stringify Schlüssel“ erzeugt):

@user.attributes=({ :name => "James Bond", :admin => true }, false) 

... aber das tut:

@user.send(:attributes=, { :name => "James Bond", :admin => true }, false) 

Wer weiß das Grund?

Antwort

6

Da der Ruby-Parser '{ :name => "James Bond", :admin => true}, false' als einzelnes-Argument zu #attributes=. Der Aufruf einer Methode 'foo=' beschränkt Sie auf ein Argument in Ruby. Die send kommt herum.

Was tatsächlich passiert, ist, dass Rails versucht, die Schlüssel von false zu stringieren, die als FalseClass statt als Hash keine hat.

+0

Danke, das hat mich verrückt gemacht! – fig

+0

Ich habe tatsächlich einige Tests in IRB durchgeführt. Das einzige Argument ist ein Array, das seine Schlüssel auch nicht beschriften kann. –

+1

Nur einmal möchte ich sehen, dass ein Array seine Schlüssel stringifiziert. – fig

1

Ich möchte sehen, ob ihr das weiter verfolgt, also muss ich .send benutzen oder wenn es einen besseren Ansatz gibt?

1

Ich habe gerade einige Hilfsmethoden definiert, um die Umgehung der Massenzuweisungseinschränkungen etwas einfacher zu machen.

module ActiveRecord 
    class Base 

    # Assigns attributes while ignoring mass assignment protection 
    def force_feed(attributes) 
     self.send(:attributes=, attributes, false) 
     self 
    end 

    end 
end 
1

In späteren Versionen von Active der zweite Parameter auf Attribute = wurde entnommen. Sie können jetzt mit dem gleichen Effekt anrufen:

model.assign_attributes(attributes, :without_protection => true) 
Verwandte Themen