ActiveModel :: ForbiddenAttributesError al crear un nuevo usuario

Tengo este modelo en Ruby pero arroja un ActiveModel::ForbiddenAttributesError

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

cuando ejecuto esta acción

  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 

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

¿Puede decirme cómo deshacerse de este error o establecer un formulario de registro de usuario adecuado?

Supongo que está utilizando Rails 4. De ser así, los parámetros necesarios deben marcarse como se requiere.

Es posible que desee hacerlo así:

 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 

Para aquellos que usan CanCan . Las personas pueden estar experimentando esto si usan CanCan con Rails 4+ . Pruebe la solución bastante limpia de AntonTrapps aquí hasta que CanCan se actualice:

En ApplicationController :

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

y en el controlador de recursos (por ejemplo NoteController):

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

Actualizar:

Aquí hay un proyecto de continuación para CanCan llamado CanCanCan , que parece prometedor:

CanCanCan

Hay una forma más fácil de evitar los Parámetros Fuertes, solo necesitas convertir los parámetros a un hash regular, como:

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

Esto derrota el propósito de los parámetros fuertes, por supuesto, pero si estás en una situación como la mía (estoy haciendo mi propia gestión de params permitidos en otra parte de mi sistema) esto hará el trabajo.

Si usa ActiveAdmin, no olvide que también hay un permit_params en el bloque de registro modelo:

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

Estos deben establecerse junto con aquellos en el controlador:

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

De lo contrario, obtendrá el error:

 ActiveModel::ForbiddenAttributesError 

Para aquellos que usan CanCanCan :

Obtendrá este error si CanCanCan no puede encontrar el método de params correcto.

Para la acción :create , CanCan intentará inicializar una nueva instancia con entrada desinfectada al ver si su controlador responderá a los siguientes métodos (en orden):

  1. create_params
  2. _params como article_params (esta es la convención predeterminada en rails para nombrar su método param)
  3. resource_params (un método genéricamente nombrado que podrías especificar en cada controlador)

Además, load_and_authorize_resource ahora puede tomar una opción param_method para especificar un método personalizado en el controlador para ejecutar para desinfectar la entrada.

Puede asociar la opción param_method con un símbolo que corresponde al nombre de un método que se llamará:

 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 

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

Alternativamente, puede usar la gem de Atributos Protegidos , sin embargo, esto frustra el propósito de requerir params fuertes. Sin embargo, si está actualizando una aplicación anterior, los Atributos protegidos ofrecen un camino fácil para actualizar hasta el momento en que pueda refactorizar attr_accessible a params fuertes.

Hola, en mi caso, el error está solucionado, pero obtener el resultado vacío es una base de datos.

  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) 

}

Mi plugin original es https://github.com/IceskYsl/worklogs