Comment attr_accessible est-il utilisé dans Rails 4?

258

attr_accessible semble ne plus fonctionner avec mon modèle.

Comment autoriser l'attribution de masse dans Rails 4?

user2532974
la source

Réponses:

447

Rails 4 utilise désormais des paramètres puissants .

La protection des attributs est désormais 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_accessiblele modèle.

Traiter avec accepts_nested_attributes_for

Pour utiliser accepts_nested_attribute_foravec des paramètres forts, vous devrez spécifier quels attributs imbriqués doivent être ajoutés à 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 juste au cas où, vous pouvez trouver plus d'informations sur les paramètres forts dans le guide Rails Action Controller .

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

Pierre-Louis Gottfrois
la source
1
Le document ne dit pas que cela attr_accessibledoit être supprimé. Que se passera-t-il si nous le conservons?
lulalala
12
Vous obtiendrez une erreur si vous n'effectuez aucun ajustement à 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.
utilisateur
6
Grande explication. Il semble que dans la pratique, cependant, cela éloigne Rails du modèle gras, du contrôleur mince, etc., et des modèles légers et des contrôleurs vraiment gonflés. Vous devez écrire tous ces trucs pour chaque instance, cela ne se lit pas bien et l'imbrication semble être une douleur. L'ancien attr_accessible / attr_accessor dans le système de modèle n'était pas cassé et n'avait pas besoin d'être réparé. Un article de blog est devenu trop populaire dans ce cas.
rcd
1
Vous n'avez pas à gérer les paramètres autorisés dans vos contrôleurs. En fait, c'est une violation du principe de responsabilité unique. Jetez un œil au billet de blog suivant edelpero.svbtle.com/strong-parameters-the-right-way
Pierre-Louis Gottfrois
3
Donc, des gadgets gimmiky et changeant fréquemment, associés à une pédantique nouvellement découverte, gaspillent de nombreuses heures de développeur dans une autre mise à niveau douloureuse de Rails :-(
Brian Takita
22

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 pouvez 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 traiter l'affectation de masse et enregistrer des objets imbriqués, et vous pouvez également utiliser la gemme protected_attributes 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
edikgat
la source
1
Lorsque vous utilisez des «paramètres forts», 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
edikgat
4

On peut utiliser

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

où personne est Model, vous pouvez passer ce code sur une méthode person_params & utiliser à la place de params [: person] dans la méthode create ou else

Hardik Hardiya
la source
2

Une mise à jour pour Rails 5:

gem 'protected_attributes' 

ne semble plus fonctionner. Mais donnez:

bijou 'protected_attributes_continued'

un essai.

miklki14567
la source
1

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

gem 'devise', '3.0.0.rc' 

Exécutez ensuite:

$ bundle

2) Ajoutez à nouveau l'ancienne fonctionnalité de attr_accessiblerails 4.0

Essayez d'utiliser attr_accessibleet ne commentez pas cela.

Ajoutez cette ligne au Gemfile de votre application:

gem 'protected_attributes'

Exécutez ensuite:

$ bundle
Sid
la source