attr_accessible
semble ne plus fonctionner avec mon modèle.
Comment autoriser l'attribution de masse dans Rails 4?
attr_accessible
semble ne plus fonctionner avec mon modèle.
Comment autoriser l'attribution de masse dans Rails 4?
Réponses:
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_accessible
le modèle.
accepts_nested_attributes_for
Pour utiliser accepts_nested_attribute_for
avec 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
.
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.
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
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
Une mise à jour pour Rails 5:
gem 'protected_attributes'
ne semble plus fonctionner. Mais donnez:
bijou 'protected_attributes_continued'
un essai.
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_accessible
rails 4.0
Essayez d'utiliser attr_accessible
et ne commentez pas cela.
Ajoutez cette ligne au Gemfile de votre application:
gem 'protected_attributes'
Exécutez ensuite:
$ bundle
attr_accessible
doit être supprimé. Que se passera-t-il si nous le conservons?