web-dev-qa-db-fra.com

Comment attr_accessible est-il utilisé dans Rails 4?

attr_accessible semble ne plus fonctionner dans mon modèle.

Quel est le moyen d'autoriser l'assignation en masse dans Rails 4?

253
user2532974

Rails 4 utilise maintenant paramètres forts .

La protection des attributs est maintenant effectuée dans le contrôleur. Ceci est un exemple:

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  private

  def person_params
    params.require(:person).permit(:name, :age)
  end
end

Plus besoin de définir attr_accessible dans le modèle.

Traiter avec accepts_nested_attributes_for

Pour pouvoir utiliser accepts_nested_attribute_for avec des paramètres forts, vous devez spécifier les attributs imbriqués devant figurer sur la liste blanche.

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

Les mots clés sont explicites, mais au cas où, vous trouverez plus d'informations sur les paramètres forts dans le guide Rails Action Controller .

Note: Si vous souhaitez toujours utiliser attr_accessible, vous devez ajouter protected_attributes à votre Gemfile. Sinon, vous serez confronté à une RuntimeError.

441

Si vous préférez attr_accessible, vous pouvez également l’utiliser dans Rails 4. .. Vous devez l’installer comme gem:

gem 'protected_attributes'

après cela, vous pourriez utiliser attr_accessible dans vos modèles, comme dans Rails 3

En outre, et je pense que c'est la meilleure façon d'utiliser des objets de formulaire pour gérer l'affectation en masse et enregistrer des objets imbriqués, vous pouvez également utiliser protected_attributes gem de cette façon

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

On peut utiliser 

params.require(:person).permit(:name, :age)

où person est Model, vous pouvez transmettre ce code à une méthode person_params & use à la place de params [: person] dans la méthode create ou bien la méthode 

4
Hardik Hardiya

1) Mettez à jour Devise pour qu’il puisse gérer Rails 4.0 en ajoutant cette ligne au fichier Gemfile de votre application:

gem 'devise', '3.0.0.rc' 

Puis exécutez:

$ bundle

2) Ajoutez à nouveau l'ancienne fonctionnalité de attr_accessible à Rails 4.0.

Essayez d'utiliser attr_accessible et ne commentez pas ceci.

Ajoutez cette ligne au fichier Gemfile de votre application:

gem 'protected_attributes'

Puis exécutez:

$ bundle
1
Sid

Une mise à jour pour Rails 5:

gem 'protected_attributes' 

ne semble plus fonctionner. Mais donnez:

gem 'protected_attributes_continued'

un essai. 

0
miklki14567