attr_accessible
Parece que ya no funciona dentro de mi modelo.
¿Cuál es la forma de permitir la asignación masiva en Rails 4?
attr_accessible
Parece que ya no funciona dentro de mi modelo.
¿Cuál es la forma de permitir la asignación masiva en Rails 4?
Respuestas:
Rails 4 ahora usa parámetros fuertes .
La protección de los atributos ahora se realiza en el controlador. Esto es un ejemplo:
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
private
def person_params
params.require(:person).permit(:name, :age)
end
end
Ya no es necesario configurar attr_accessible
el modelo.
accepts_nested_attributes_for
Para usar accepts_nested_attribute_for
con parámetros fuertes, deberá especificar qué atributos anidados se deben incluir en la lista blanca.
class Person
has_many :pets
accepts_nested_attributes_for :pets
end
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
# ...
private
def person_params
params.require(:person).permit(:name, :age, pets_attributes: [:name, :category])
end
end
Las palabras clave se explican por sí mismas, pero por si acaso, puede encontrar más información sobre parámetros sólidos en la guía Controlador de acción Rails .
Nota : Si aún desea usar attr_accessible
, debe agregar protected_attributes
a su Gemfile
. De lo contrario, te enfrentarás con a RuntimeError
.
RuntimeError in MicropostsController#index 'attr_accessible' is extracted out of Rails into a gem. Please use new recommended protection model for params(strong_parameters) or add 'protected_attributes' to your Gemfile to use old one.
Si prefiere attr_accessible, también podría usarlo en Rails 4. Debes instalarlo como gema:
gem 'protected_attributes'
después de eso, podría usar attr_accessible en sus modelos como en Rails 3
Además, y creo que es la mejor manera: usar objetos de formulario para lidiar con la asignación masiva y guardar objetos anidados, y también puede usar la gema protected_attributes de esa manera
class NestedForm
include ActiveModel::MassAssignmentSecurity
attr_accessible :name,
:telephone, as: :create_params
def create_objects(params)
SomeModel.new(sanitized_params(params, :create_params))
end
end
Nosotros podemos usar
params.require(:person).permit(:name, :age)
donde person es Model, puede pasar este código en un método person_params y usarlo en lugar de params [: person] en el método create o en el método else
Una actualización para Rails 5:
gem 'protected_attributes'
Parece que ya no funciona. Pero dar:
gema 'protected_attributes_continued'
un intento.
1) Actualice el dispositivo para que pueda manejar Rails 4.0 agregando esta línea al Gemfile de su aplicación:
gem 'devise', '3.0.0.rc'
Luego ejecuta:
$ bundle
2) Agregue la funcionalidad anterior de attr_accessible
nuevo a rails 4.0
Intente usar attr_accessible
y no comente esto.
Agregue esta línea al Gemfile de su aplicación:
gem 'protected_attributes'
Luego ejecuta:
$ bundle
attr_accessible
necesario eliminarlo. ¿Qué pasará si lo guardamos?