attr_accessible
ne semble plus fonctionner dans mon modèle.
Comment permettre l'affectation de masse dans Rails 4 ?
attr_accessible
ne semble plus fonctionner dans mon modèle.
Comment permettre l'affectation de masse dans Rails 4 ?
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.
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
.
Le document ne dit pas que attr_accessible
doivent être retirés. Que se passera-t-il si nous le gardons ?
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.
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.
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
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.
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 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.