J'ai ce modèle en Ruby mais ça jette un ActiveModel::ForbiddenAttributesError
class User < ActiveRecord::Base
attr_accessor :password
validates :username, :presence => true, :uniqueness => true, :length => {:in => 3..20}
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, :uniqueness => true, format: { with: VALID_EMAIL_REGEX }
validates :password, :confirmation => true
validates_length_of :password, :in => 6..20, :on => :create
before_save :encrypt_password
after_save :clear_password
def encrypt_password
if password.present?
self.salt = BCrypt::Engine.generate_salt
self.encrypted_password= BCrypt::Engine.hash_secret(password, salt)
end
end
def clear_password
self.password = nil
end
end
quand je lance cette action
def create
@user = User.new(params[:user])
if @user.save
flash[:notice] = "You Signed up successfully"
flash[:color]= "valid"
else
flash[:notice] = "Form is invalid"
flash[:color]= "invalid"
end
render "new"
end
le ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
.
Pouvez-vous s'il vous plaît me dire comment me débarrasser de cette erreur ou établir un bon formulaire d'inscription d'utilisateur?
protected_attributes
gemme à utiliserattr_accessible
.Réponses:
Je suppose que vous utilisez Rails 4. Si c'est le cas, les paramètres nécessaires doivent être marqués comme requis.
Vous voudrez peut-être le faire comme ceci:
la source
strong_parameter
gemme. Il est couvert dans Rails Guides: guides.rubyonrails.org/… .Pour ceux qui utilisent CanCan . Les gens pourraient éprouver cela s'ils utilisent CanCan avec Rails 4+ . Essayez la solution de contournement plutôt propre d' AntonTrapps ici jusqu'à ce que CanCan soit mis à jour:
Dans le
ApplicationController
:et dans le contrôleur de ressources (par exemple NoteController):
Mettre à jour:
Voici un projet de continuation pour CanCan appelé CanCanCan , qui semble prometteur:
CanCanCan
la source
load_resource
ou utiliserload_resource :except => :create
résolu le problème. Vérifiez la réponse originale iciIl existe un moyen plus simple d'éviter les paramètres forts, il vous suffit de convertir les paramètres en un hachage normal, comme:
Cela va à l'encontre du but des paramètres forts bien sûr, mais si vous êtes dans une situation comme la mienne (je fais ma propre gestion des paramètres autorisés dans une autre partie de mon système), cela fera le travail.
la source
unable to convert unpermitted parameters to hash
Si vous utilisez ActiveAdmin, n'oubliez pas qu'il existe également un permit_params dans le bloc de registre de modèle:
Ceux-ci doivent être définis avec ceux du contrôleur:
Sinon, vous obtiendrez l'erreur:
la source
Pour ceux qui utilisent CanCanCan :
Vous obtiendrez cette erreur si CanCanCan ne peut pas trouver la bonne méthode de paramétrage .
Pour l'
:create
action, CanCan essaiera d'initialiser une nouvelle instance avec une entrée filtrée en vérifiant si votre contrôleur répondra aux méthodes suivantes (dans l'ordre):create_params
<model_name>_params
comme article_params (c'est la convention par défaut dans rails pour nommer votre méthode param)resource_params
(une méthode au nom générique que vous pouvez spécifier dans chaque contrôleur)En outre,
load_and_authorize_resource
peut désormais prendre uneparam_method
option pour spécifier une méthode personnalisée dans le contrôleur à exécuter pour nettoyer l'entrée.Vous pouvez associer l'
param_method
option à un symbole correspondant au nom d'une méthode qui sera appelée:source: https://github.com/CanCanCommunity/cancancan#33-strong-parameters
la source
Alternativement, vous pouvez utiliser la gemme Attributs protégés , mais cela va à l'encontre du but d'exiger des paramètres solides. Cependant, si vous mettez à niveau une ancienne application, les attributs protégés fournissent un chemin facile pour la mise à niveau jusqu'à ce que vous puissiez refactoriser l'attr_accessible en paramètres puissants.
la source
Si vous êtes sur Rails 4 et que vous obtenez cette erreur, cela peut arriver si vous utilisez
enum
sur le modèle si vous avez défini avec des symboles comme celui-ci:Le formulaire passera par exemple un sélecteur radio comme paramètre de chaîne. C'est ce qui s'est passé dans mon cas. La solution simple consiste à remplacer
enum
les chaînes par des symbolesla source