ActiveModel :: ForbiddenAttributesError durante la creazione di un nuovo utente

Ho questo modello in Ruby ma lancia un ActiveModel::ForbiddenAttributesError

 class User  true, :uniqueness => true, :length => {:in => 3..20} VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][az\d\-.]+\.[az]+\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 

quando eseguo questa azione

  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 

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

Puoi dirmi come liberarti di questo errore o stabilire un modulo di registrazione utente corretto?

Immagino tu stia usando Rails 4. Se è così, i parametri necessari devono essere contrassegnati come richiesto.

Potresti volerlo fare in questo modo:

 class UsersController < ApplicationController def create @user = User.new(user_params) # ... end private def user_params params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password) end end 

Per chi usa CanCan . Le persone potrebbero sperimentarlo se utilizzano CanCan con Rails 4+ . Prova la soluzione alternativa al problema di AntonTrapps qui finché CanCan non viene aggiornato:

In ApplicationController :

 before_filter do resource = controller_name.singularize.to_sym method = "#{resource}_params" params[resource] &&= send(method) if respond_to?(method, true) end 

e nel controller risorse (ad esempio NoteController):

 private def note_params params.require(:note).permit(:what, :ever) end 

Aggiornare:

Ecco un progetto di continuazione per CanCan chiamato CanCanCan , che sembra promettente:

CanCanCan

C’è un modo più semplice per evitare i parametri forti, è sufficiente convertire i parametri in un normale hash, come:

 unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params) model.create!(unlocked_params) 

Ciò ovviamente sconfigge lo scopo di parametri forti, ma se ti trovi in ​​una situazione come la mia (sto facendo la mia gestione dei parametri consentiti in un’altra parte del mio sistema), questo porterà a termine il lavoro.

Se si utilizza ActiveAdmin, non dimenticare che esistono anche un permesso_param nel blocco di registrazione del modello:

 ActiveAdmin.register Api::V1::Person do permit_params :name, :address, :etc end 

Questi devono essere impostati insieme a quelli nel controller:

 def api_v1_person_params params.require(:api_v1_person).permit(:name, :address, :etc) end 

Altrimenti si otterrà l’errore:

 ActiveModel::ForbiddenAttributesError 

Per chi utilizza CanCanCan :

Si otterrà questo errore se CanCanCan non riesce a trovare il metodo params corretto.

Per l’azione :create , CanCan proverà a inizializzare una nuova istanza con input igienizzato vedendo se il controller risponderà ai seguenti metodi (in ordine):

  1. create_params
  2. _params come article_params (questa è la convenzione predefinita in rotaie per nominare il metodo param)
  3. resource_params (un metodo con nomi generici che è ansible specificare in ciascun controller)

Inoltre, load_and_authorize_resource ora può param_method opzione param_method per specificare un metodo personalizzato nel controller da eseguire per disinfettare l’input.

Puoi associare l’opzione param_method con un simbolo corrispondente al nome di un metodo che verrà chiamato:

 class ArticlesController < ApplicationController load_and_authorize_resource param_method: :my_sanitizer def create if @article.save # hurray else render :new end end private def my_sanitizer params.require(:article).permit(:name) end end 

fonte: https://github.com/CanCanCommunity/cancancan#strong-parameters

In alternativa puoi usare la gem Protected Attributes , tuttavia ciò vanifica lo scopo di richiedere parametri forti. Tuttavia, se si sta aggiornando un’app precedente, gli attributi protetti forniscono un percorso facile per l’aggiornamento fino al momento in cui è ansible ridefinire l’attr_accessibile ai parametri forti.

ciao nel mio caso l’errore è stato risolto ma il risultato vuoto è il database.

  def create @worklog = Worklog.new(user_params) @worklog.day = Date.today @worklog.week = Date.today.strftime("%W").to_i @worklog.author = User.current @worklog.save redirect_to worklogs_path() end def user_params params.require(:worklog).permit(:utf8, :authenticity_token, {:worklog => [:typee, :do, :todo, :feel, :plan_done, :plan, :week_feel, :score, :good, :nogood]}, :commit) 

}

Il mio plugin originale è https://github.com/IceskYsl/worklogs