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?
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
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:
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.
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
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):
create_params
-
<model_name>_params
como article_params (esto es la convención por defecto en rails para nombrar tu método param) -
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
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.
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
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