wake-up-neo.com

Wie wird attr_accessible in Rails 4 verwendet?

attr_accessible scheint in meinem Modell nicht mehr zu funktionieren.

Wie kann man Massenzuweisungen in Rails 4 zulassen?

253
user2532974

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.

Umgang mit 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.

441

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
22
edikgat

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 

4
Hardik Hardiya

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
1
Sid

Ein Update für Rails 5:

gem 'protected_attributes' 

scheint nicht mehr zu funktionieren. Aber gib:

gem 'protected_attributes_continued'

ein Versuch. 

0
miklki14567