update rails query left includes generate active ruby-on-rails rails-activerecord

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):

  1. create_params
  2. <model_name>_params como article_params (esta es la convención predeterminada en los rieles para nombrar tu método param)
  3. 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:

CanCanCan