ruby on rails - rails - ActiveModel:: ForbiddenAttributesError al crear un nuevo usuario
rails sql query (6)
Alternativamente, puede usar la gema de Atributos Protegidos , sin embargo, esto anula el propósito de requerir parámetros fuertes. Sin embargo, si está actualizando una aplicación más antigua, los atributos protegidos proporcionan una vía fácil de actualizar hasta el momento en que pueda refactorizar el attr_accessible a los parámetros fuertes.
Tengo este modelo en Ruby pero lanza 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 corro esta accion
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 deshacerme de este error o establecer un formulario de registro de usuario adecuado?
Hay una manera más fácil de evitar los parámetros fuertes, solo necesita convertir los parámetros a un hash regular, como:
unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)
model.create!(unlocked_params)
Esto elimina el propósito de los parámetros sólidos, por supuesto, pero si estás 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.
Para aquellos que utilizan CanCanCan:
Obtendrá este error si CanCanCan no puede encontrar el método de parámetros 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):
-
create_params
-
<model_name>_params
como article_params (esta es la convención predeterminada en los rieles para nombrar tu método param) -
resource_params
(un método con nombre genérico 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 para sanear la entrada.
Puede asociar la opción param_method
con un símbolo correspondiente 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
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 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
Supongo que está utilizando Rails 4. Si es así, los parámetros necesarios deben marcarse según sea necesario.
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
Para aquellos que usan CanCan . La gente podría estar experimentando esto si usan CanCan con Rails 4+ . Pruebe AntonTrapps''s solución alternativa bastante limpia de AntonTrapps''s AntonTrapps''s 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
Actualizar:
Aquí hay un proyecto de continuación para CanCan llamado CanCanCan , que parece prometedor: