attr_accessible
scheint in meinem Modell nicht mehr zu funktionieren.
Wie kann man Massenzuweisungen in Rails 4 zulassen?
Rails 4 verwendet jetzt starke Parameter .
Der Schutz von Attributen erfolgt jetzt in der Steuerung. Dies ist ein Beispiel:
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
private
def person_params
params.require(:person).permit(:name, :age)
end
end
attr_accessible
muss nicht mehr im Modell eingestellt werden.
accepts_nested_attributes_for
Um accepts_nested_attribute_for
mit starken Parametern verwenden zu können, müssen Sie angeben, welche verschachtelten Attribute auf die Whitelist gesetzt werden sollen.
class Person
has_many :pets
accepts_nested_attributes_for :pets
end
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
# ...
private
def person_params
params.require(:person).permit(:name, :age, pets_attributes: [:name, :category])
end
end
Die Schlüsselwörter sind selbsterklärend. Für den Fall, dass Sie weitere Informationen zu den starken Parametern im Handbuch des Rails Action Controller finden.
Note: Wenn Sie weiterhin attr_accessible
verwenden möchten, müssen Sie protected_attributes
zu Ihrer Gemfile
hinzufügen. Andernfalls werden Sie mit einer RuntimeError
konfrontiert.
Wenn Sie attr_accessible bevorzugen, können Sie es auch in Rails 4 verwenden. __ Sie sollten es wie gem installieren:
gem 'protected_attributes'
danach könnten Sie attr_accessible in Ihren Modellen wie in Rails 3 verwenden
Und, und ich denke, das ist der beste Weg. Verwenden Sie Formularobjekte zur Behandlung von Massenzuweisungen und zum Speichern von verschachtelten Objekten. Sie können auch protected_attributes gem verwenden
class NestedForm
include ActiveModel::MassAssignmentSecurity
attr_accessible :name,
:telephone, as: :create_params
def create_objects(params)
SomeModel.new(sanitized_params(params, :create_params))
end
end
Wir können benutzen
params.require(:person).permit(:name, :age)
wenn Person Model ist, können Sie diesen Code an eine Methode person_params übergeben und anstelle von params [: person] in der create-Methode oder else-Methode verwenden
1) Aktualisieren Sie Devise so, dass es mit Rails 4.0 umgehen kann, indem Sie diese Zeile zu Gemfile Ihrer Anwendung hinzufügen:
gem 'devise', '3.0.0.rc'
Dann führe aus:
$ bundle
2) Fügen Sie die alte Funktionalität von attr_accessible
erneut zu Rails 4.0 hinzu
Verwenden Sie attr_accessible
und kommentieren Sie das nicht aus.
Fügen Sie diese Zeile zum Gemfile Ihrer Anwendung hinzu:
gem 'protected_attributes'
Dann führe aus:
$ bundle
Ein Update für Rails 5:
gem 'protected_attributes'
scheint nicht mehr zu funktionieren. Aber gib:
gem 'protected_attributes_continued'
ein Versuch.