¿Cómo se usa attr_accessible en Rails 4?

258

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?

usuario2532974
fuente

Respuestas:

447

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_accessibleel modelo.

Tratando con accepts_nested_attributes_for

Para usar accepts_nested_attribute_forcon 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_attributesa su Gemfile. De lo contrario, te enfrentarás con a RuntimeError.

Pierre-Louis Gottfrois
fuente
1
El documento no dice que sea attr_accessiblenecesario eliminarlo. ¿Qué pasará si lo guardamos?
lulalala
12
Obtendrá un error si no realiza algunos ajustes en su Gemfile. 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.
usuario
66
Gran explicación Sin embargo, parece que en la práctica, esto aleja a Rails del modelo gordo, el controlador delgado, etc., y lo acerca a modelos delgados y controladores realmente hinchados. Tienes que escribir todo esto para cada instancia, no se lee bien y anidar parece ser un dolor. El antiguo attr_accessible / attr_accessor en el sistema modelo no estaba roto y no necesitaba ser reparado. Una publicación de blog se hizo demasiado popular en este caso.
rcd
1
No tiene que manejar los parámetros permitidos en sus controladores. De hecho, es una violación del principio de responsabilidad única. Eche un vistazo a la siguiente publicación de blog edelpero.svbtle.com/strong-parameters-the-right-way
Pierre-Louis Gottfrois
3
Así que las apis truculentas y que cambian con frecuencia, junto con pedantes recién descubiertos desperdician muchas horas de desarrollador en otra actualización de Rails dolorosa :-(
Brian Takita
22

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
edikgat
fuente
1
Cuando usa 'parámetros fuertes', filtra los parámetros en la capa del controlador, y no creo que esta sea la mejor idea para todas las aplicaciones. Para mí, la mejor manera de filtrar parámetros es usar una capa adicional. Y podemos usar la gema 'protected_attributes' para escribir esta capa
edikgat
4

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

Hardik Hardiya
fuente
2

Una actualización para Rails 5:

gem 'protected_attributes' 

Parece que ya no funciona. Pero dar:

gema 'protected_attributes_continued'

un intento.

miklki14567
fuente
1

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_accessiblenuevo a rails 4.0

Intente usar attr_accessibley no comente esto.

Agregue esta línea al Gemfile de su aplicación:

gem 'protected_attributes'

Luego ejecuta:

$ bundle
Sid
fuente