262 votes

Comment est utilisé attr_accessible dans Rails 4 ?

attr_accessible ne semble plus fonctionner dans mon modèle.

Comment permettre l'affectation de masse dans Rails 4 ?

450voto

Rails 4 utilise désormais paramètres forts .

La protection des attributs se fait désormais dans le contrôleur. Voici un exemple :

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

  private

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

Il n'est pas nécessaire de définir attr_accessible dans le modèle.

Traiter avec accepts_nested_attributes_for

Afin d'utiliser accepts_nested_attribute_for avec des paramètres forts, vous devrez préciser quels attributs imbriqués doivent être mis sur 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 auto-explicatifs, mais au cas où, vous pouvez trouver plus d'informations sur les paramètres forts dans le guide Rails Action Controller .

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

1 votes

Le document ne dit pas que attr_accessible doivent être retirés. Que se passera-t-il si nous le gardons ?

12 votes

Vous obtiendrez une erreur si vous ne faites pas quelques ajustements à votre Gemfile. 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.

6 votes

Excellente explication. Cependant, il semble qu'en pratique, cela éloigne Rails de l'idée d'un gros modèle, d'un contrôleur fin, etc., pour le rapprocher de modèles fins et de contrôleurs très lourds. Il faut écrire tout ça pour chaque instance, ça ne se lit pas bien, et l'imbrication semble être un problème. L'ancien attr_accessible/attr_accessor du système de modèles n'était pas cassé et n'avait pas besoin d'être corrigé. Un article de blog est devenu trop populaire dans ce cas.

23voto

edikgat Points 303

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

gem 'protected_attributes'

Après cela, vous pouvez utiliser attr_accessible dans vos modèles comme dans Rails 3.

De plus, et je pense que c'est la meilleure solution, l'utilisation d'objets de formulaire pour gérer les affectations de masse et sauvegarder les objets imbriqués, et 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

1 votes

Lorsque vous utilisez "strong parameters", vous filtrez les paramètres dans la couche contrôleur, et je ne pense pas que ce soit la meilleure idée pour toutes les applications. Pour moi, la meilleure façon de filtrer les paramètres est d'utiliser une couche supplémentaire. Et nous pouvons utiliser la gemme 'protected_attributes' pour écrire cette couche.

4voto

Hardik Hardiya Points 777

Nous pouvons utiliser

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

où person est un modèle, vous pouvez passer ce code dans une méthode person_params et l'utiliser à la place de params[:person] dans la méthode create ou else.

4voto

miklki14567 Points 54

Une mise à jour pour Rails 5 :

gem 'protected_attributes' 

ne semble plus fonctionner. Mais donne :

gem 'protected_attributes_continued'.

un essai.

1voto

Sid Points 19

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

gem 'devise', '3.0.0.rc' 

Alors exécutez :

$ bundle

2) Ajouter l'ancienne fonctionnalité de attr_accessible à nouveau vers rails 4.0

Essayez d'utiliser attr_accessible et ne commentez pas ça.

Ajoutez cette ligne au Gemfile de votre application :

gem 'protected_attributes'

Alors exécutez :

$ bundle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X