strong rails permit attr_accessible ruby-on-rails ruby-on-rails-4 activemodel attr-accessible strong-parameters

ruby on rails - permit - Error de Atributos Prohibidos en Rails 4 cuando se encuentra con una situaciĆ³n en la que uno hubiera utilizado attr_accessible en versiones anteriores de Rails



strong parameters nested attributes (5)

Este problema también podría ser causado por la gema Cancan

Solo agregue a application_controller.rb

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

Funciona sin modificaciones adicionales de código lo consiguió desde aquí: https://github.com/ryanb/cancan/issues/835#issuecomment-18663815

Con la reciente actualización a Rails 4, la actualización de atributos usando un código que se asemeja al siguiente no funciona, obtengo un error de ActiveModel::ForbiddenAttributes :

@user.update_attributes(params[:user], :as => :admin)

Donde el usuario tiene la siguiente línea attr_accessible en el modelo:

attr_accessible :role_ids, :as =>admin # or any attribute other than :role_ids contained within :user

¿Cómo se realiza la misma tarea en Rails 4?


No olvide agregar su nuevo método user_params a la acción del controlador:

def create @user = User.new(user_params) @user.save redirect_to ''wherever'' end


Rails 4 ahora tiene características de la gema strong_parameters incorporada por defecto.

Ya no es necesario realizar llamadas :as => :admin , ni necesita attr_accessible :user_attribute, :as => admin en su modelo. La razón de esto es que, de forma predeterminada, las aplicaciones de rieles ahora tienen "seguridad" para cada atributo en los modelos. Debe permit el atributo que desea acceder / modificar.

Todo lo que necesita hacer ahora es permit llamada durante los update_attributes :

@user.update_attributes(params[:user], permit[:user_attribute]

o, para ser más precisos:

@user.update_attributes(params[:user].permit(:role_ids))

Esta única línea, sin embargo, permite a cualquier usuario modificar el rol permitido. Debe recordar permitir solo el acceso a esta acción por un administrador o cualquier otro rol deseado a través de otro filtro como el siguiente:

authorize! :update, @user, :message => ''Not authorized as an administrator.''

. . . lo cual funcionaría si estás usando Devise y CanCan para autenticación y autorización.


Si crea un nuevo sitio de Rails 4, notará que los controladores generados ahora incluyen un método privado que utiliza para recibir sus parámetros desinfectados. Este es un buen modismo, y se ve así:

private def user_params params.require(:user).permit(:username, :email, :password) end

La antigua forma de permitir la asignación masiva era usar algo como:

attr_accessible :username, :email, :password

en su modelo para marcar ciertos parámetros como accesibles.

Actualización

Para actualizar tienes varias opciones. Su mejor solución sería refactorizar sus controladores con un método de params. Sin embargo, esto podría ser más trabajo del que tienes ahora.

Protected_attributes gema

La alternativa sería usar la gema protected_attributes que restablece el método attr_accessible. Esto proporciona una ruta de actualización ligeramente más suave con una advertencia importante.

Mayor advertencia

En Rails 3, cualquier modelo sin una llamada attr_accessible permitió todos los atributos.

En Rails 4 con la gema protected_attributes, este comportamiento se invierte. Cualquier modelo sin una llamada attr_accessible tiene todos los atributos restringidos. Ahora debe declarar attr_accessible en todos sus modelos. Esto significa que, si no ha utilizado attr_accessible, deberá agregar esto a todos sus modelos, lo que puede ser tanto trabajo como crear un método de params.

https://github.com/rails/protected_attributes


def create @user = User.create(user_params) .... end def update @user = User.find(params[:id]) if @user.update_attributes(blog_params) redirect_to home_path, notice: "Your profile has been successfully updated." else render action: "edit" end end private def user_params params.require(:user).permit(:name, :age, :others) end