attr_accessible
scheint in meinem Modell nicht mehr zu funktionieren.
Wie kann die Massenzuweisung in Rails 4 zugelassen werden?
attr_accessible
scheint in meinem Modell nicht mehr zu funktionieren.
Wie kann die Massenzuweisung in Rails 4 zugelassen werden?
Antworten:
Schienen 4 verwendet jetzt starke Parameter .
Das Schützen 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
Keine Notwendigkeit, setzt attr_accessible
mehr im Modell.
accepts_nested_attributes_for
Um accepts_nested_attribute_for
mit starken Parametern arbeiten zu können, müssen Sie angeben, welche verschachtelten Attribute in die Whitelist aufgenommen 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
Schlüsselwörter sind selbsterklärend, aber für alle Fälle finden Sie weitere Informationen zu starken Parametern im Rails Action Controller-Handbuch .
Hinweis : Wenn Sie weiterhin verwenden möchten attr_accessible
, müssen Sie protected_attributes
Ihre hinzufügen Gemfile
. Andernfalls werden Sie mit einem konfrontiert RuntimeError
.
RuntimeError in MicropostsController#index 'attr_accessible' is extracted out of Rails into a gem. Please use new recommended protection model for params(strong_parameters) or add 'protected_attributes' to your Gemfile to use old one.
Wenn Sie attr_accessible bevorzugen, können Sie es auch in Rails 4 verwenden. Sie sollten es wie ein Juwel installieren:
gem 'protected_attributes'
Danach können Sie attr_accessible in Ihren Modellen wie in Rails 3 verwenden
Außerdem denke ich, dass dies der beste Weg ist, Formularobjekte für den Umgang mit Massenzuweisungen und das Speichern verschachtelter Objekte zu verwenden, und Sie können auf diese Weise auch den Edelstein protected_attributes 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 create method oder else method verwenden
Ein Update für Rails 5:
gem 'protected_attributes'
scheint nicht mehr zu funktionieren. Aber gib:
gem 'protected_attributes_continued'
ein Versuch.
1) Aktualisieren Sie Devise so, dass es Rails 4.0 verarbeiten kann, indem Sie diese Zeile zum Gemfile Ihrer Anwendung hinzufügen:
gem 'devise', '3.0.0.rc'
Führen Sie dann Folgendes aus:
$ bundle
2) Fügen Sie die alte Funktionalität von attr_accessible
wieder zu Rails 4.0 hinzu
Versuchen Sie dies zu verwenden attr_accessible
und kommentieren Sie es nicht aus.
Fügen Sie diese Zeile zum Gemfile Ihrer Anwendung hinzu:
gem 'protected_attributes'
Führen Sie dann Folgendes aus:
$ bundle
attr_accessible
das entfernt werden muss. Was passiert, wenn wir es behalten?