Interdit Attributs d'Erreur dans les Rails 4 lors de la rencontre d'une situation où l'on aurait utilisé attr_accessible dans les versions antérieures de Rails
Avec la récente mise à jour de Rails 4, mise à jour des attributs à l'aide de code comme celui ci-dessous ne fonctionne pas, j'obtiens un ActiveModel::ForbiddenAttributes
erreur:
@user.update_attributes(params[:user], :as => :admin)
Où l'Utilisateur a la suite de attr_accessible ligne dans le modèle:
attr_accessible :role_ids, :as =>admin
# or any attribute other than :role_ids contained within :user
Comment voulez-vous accomplir la même tâche dans les Rails 4?
Vous devez vous connecter pour publier un commentaire.
Rails 4 a désormais des fonctionnalités de la strong_parameters gem intégrées par défaut.
On n'a plus à faire des appels
:as => :admin
, ni avez-vous besoin de laattr_accessible :user_attribute, :as => admin
dans votre modèle. La raison pour cela est que, par défaut, les rails applications ont maintenant de "sécurité" pour chaque attribut sur les modèles. Vous devezpermit
l'attribut que vous souhaitez consulter /modifier.Tout ce que vous devez faire maintenant est de les appeler
permit
pendantupdate_attributes
:ou, pour être plus précis:
Cette seule ligne, cependant, permet à tout utilisateur de modifier les
permit
ted rôle. Vous devez vous rappeler de ne permettre l'accès à cette action par un administrateur ou toute autre rôle désiré par un autre filtre, tel que le suivant:. . . qui pourrait fonctionner si vous utilisez Concevoir et de french CanCan pour l'authentification et l'autorisation.
Si vous créez un nouveau Rails 4 site, vous remarquerez que généré contrôleurs comprennent maintenant une méthode privée qui vous permet de recevoir votre désinfectés params. C'est un bel idiome, et ressemble à quelque chose comme ceci:
L'ancienne voie permettant de masse a été d'utiliser quelque chose comme:
sur votre modèle de marque de certains paramètres accessibles.
La mise à niveau de
De mise à niveau, vous disposez de plusieurs options. La meilleure solution serait de revoir vos contrôleurs avec un params méthode. Ce serait peut-être plus de travail que vous avez le temps pour l'instant.
Protected_attributes gem
L'alternative serait d'utiliser la protected_attributes gem qui rétablit le attr_accessible méthode. Ceci en fait un peu plus lisse chemin de mise à niveau avec un bémol de taille.
Bémol De Taille
Dans Rails 3, un modèle sans attr_accessible appel a permis à tous les attributs de si.
Dans les Rails 4 avec le protected_attributes gem ce comportement est inversé. Un modèle sans attr_accessible appel a tous les attributs restreint. Il faut maintenant déclarer attr_accessible sur tous vos modèles. Cela signifie que, si vous n'avez pas été à l'aide de attr_accessible, vous aurez besoin d'ajouter ce message à tous vos modèles, qui peuvent être autant de travail que la simple création d'une params méthode.
https://github.com/rails/protected_attributes
Ce problème peut aussi être causé par la Cancan gem
Vient de s'ajouter à application_controller.rb
Fonctionne sans autres modifications de code
obtenu à partir d'ici: https://github.com/ryanb/cancan/issues/835#issuecomment-18663815
N'oubliez pas d'ajouter votre nouveau user_params méthode à l'action de contrôleur: