ActiveModel:: ForbiddenAttributesError al crear un nuevo usuario


Tengo este modelo en Ruby pero arroja 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

Cuando ejecute 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

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

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

Author: Vertexwahn, 2013-06-27

7 answers

Supongo que estás usando Rails 4. Si es así, los parámetros necesarios deben marcarse como requeridos.

Es posible que desee hacerlo de esta manera:

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
 374
Author: Domon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-27 06:21:16

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

En el 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

Actualización:

Aquí hay un proyecto de continuación para CanCan llamado CanCanCan, que se ve promising:

CanCanCan

 63
Author: mjnissim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-19 01:12:23

Hay una manera más fácil de evitar los Parámetros Fuertes en absoluto, solo tiene que convertir los parámetros a un hash regular, como:

unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)

model.create!(unlocked_params)

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

 23
Author: Wilker Lucio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-14 18:07:11

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

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

Estos deben establecerse junto con los del controlador:

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

De lo contrario obtendrá el error:

ActiveModel::ForbiddenAttributesError
 19
Author: StuR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-26 17:55:40

Para aquellos que usan CanCanCan :

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

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

  1. create_params
  2. <model_name>_params como article_params (esto es la convención por defecto en rails para nombrar tu método param)
  3. resource_params (a genéricamente método con nombre que podría 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 sanitize input.

Puede asociar la opción param_method con un símbolo correspondiente al nombre de un método al 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

 9
Author: Andreas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-06 14:42:27

Alternativamente puede usar la gema Atributos protegidos, sin embargo esto frustra el propósito de requerir parámetros fuertes. Sin embargo, si está actualizando una aplicación anterior, los atributos protegidos proporcionan una vía fácil para actualizar hasta el momento en que pueda refactorizar el attr_accessible a parámetros fuertes.

 3
Author: Brian Dear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-22 02:30:15

Hola en mi caso se ha solucionado el error, pero obtener un resultado vacío es la 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

 -1
Author: Dipen Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-11 16:42:53