242 votes

ActiveModel::ForbiddenAttributesError lors de la création d'un nouvel utilisateur

J'ai ce modèle en Ruby mais il jette une 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

sur ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux] .

Pouvez-vous me dire comment me débarrasser de cette erreur ou établir un formulaire d'inscription correct pour les utilisateurs ?

2 votes

Essayez d'ajouter attr_accessible :password, :password_confirmation,:user_name, :email, :your-other-attributes dans le modèle User

1 votes

Ajouter paramètre fort la pierre précieuse à utiliser attr_accessible .

0 votes

Paramètres forts pour utiliser attr_accessible ?!

3voto

Brian Dear Points 202

Vous pouvez également utiliser l'option Gemme des attributs protégés Cependant, cela va à l'encontre de l'objectif d'exiger des paramètres forts. Cependant, si vous mettez à jour une ancienne application, les Attributs protégés offrent une voie facile pour la mise à niveau jusqu'à ce que vous puissiez remanier l'attr_accessible en paramètres forts.

1voto

Steve Giáp Points 1

Une raison supplémentaire est que vous remplacez permitted_params par une méthode. Par exemple

def permitted_params
   params.permit(:email, :password)
end

0voto

lacostenycoder Points 401

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 l'avez défini avec des symboles comme celui-ci :

class User
  enum preferred_phone: [:home_phone, :mobile_phone, :work_phone]
end

Le formulaire transmettra un sélecteur radio en tant que paramètre de type chaîne. C'est ce qui s'est passé dans mon cas. La solution simple consiste à modifier enum à des chaînes de caractères au lieu de symboles

enum preferred_phone: %w[home_phone mobile_phone work_phone]
# or more verbose
enum preferred_phone: ['home_phone', 'mobile_phone', 'work_phone']

Prograide.com

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.

Powered by:

X