Wie wird attr_accessible in Rails 4 verwendet?

258

attr_accessible scheint in meinem Modell nicht mehr zu funktionieren.

Wie kann die Massenzuweisung in Rails 4 zugelassen werden?

user2532974
quelle

Antworten:

447

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_accessiblemehr im Modell.

Umgehen mit accepts_nested_attributes_for

Um accepts_nested_attribute_formit 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_attributesIhre hinzufügen Gemfile. Andernfalls werden Sie mit einem konfrontiert RuntimeError.

Pierre-Louis Gottfrois
quelle
1
Das Dokument sagte nicht, dass attr_accessibledas entfernt werden muss. Was passiert, wenn wir es behalten?
Lulalala
12
Sie erhalten eine Fehlermeldung, wenn Sie keine Anpassungen an Ihrem Gemfile vornehmen. 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.
Benutzer
6
Tolle Erklärung. In der Praxis scheint dies jedoch so zu sein, dass Rails von einem fetten Modell, einem dünnen Controller usw. zu dünnen Modellen und wirklich aufgeblähten Controllern hin- und herbewegt wird. Sie müssen all dieses Zeug für jede Instanz schreiben, es liest sich nicht gut und das Verschachteln scheint ein Schmerz zu sein. Der alte attr_accessible / attr_accessor im Modellsystem war nicht defekt und musste nicht repariert werden. Ein Blog-Beitrag wurde in diesem Fall zu beliebt.
RCD
1
Sie müssen die zulässigen Parameter in Ihren Controllern nicht verarbeiten. Tatsächlich verstößt es gegen das Prinzip der Einzelverantwortung. Werfen
Pierre-Louis Gottfrois
3
So verschwenderisch und häufig wechselnde Apis, gepaart mit neu entdeckter Pedantik, verschwenden viele Entwicklerstunden in einem weiteren schmerzhaften Rails-Upgrade :-(
Brian Takita
22

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
edikgat
quelle
1
Wenn Sie 'starke Parameter' verwenden, filtern Sie Parameter in der Controller-Schicht, und ich denke nicht, dass dies die beste Idee für alle Anwendungen ist. Für mich ist der beste Weg, Parameter zu filtern, die Verwendung einer zusätzlichen Ebene. Und wir können 'protected_attributes' Juwel verwenden, um diese Ebene zu schreiben
edikgat
4

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

Hardik Hardiya
quelle
2

Ein Update für Rails 5:

gem 'protected_attributes' 

scheint nicht mehr zu funktionieren. Aber gib:

gem 'protected_attributes_continued'

ein Versuch.

miklki14567
quelle
1

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_accessiblewieder zu Rails 4.0 hinzu

Versuchen Sie dies zu verwenden attr_accessibleund 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
Sid
quelle