Come viene utilizzato attr_accessible in Rails 4?


Risposte:


447

Rails 4 ora utilizza parametri forti .

La protezione degli attributi è ora eseguita nel controller. Questo è un esempio:

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  private

  def person_params
    params.require(:person).permit(:name, :age)
  end
end

Non è più necessario impostare attr_accessibleil modello.

Trattare con accepts_nested_attributes_for

Per utilizzare accepts_nested_attribute_forcon parametri avanzati, è necessario specificare quali attributi nidificati devono essere autorizzati.

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

Le parole chiave sono autoesplicative, ma per ogni evenienza puoi trovare maggiori informazioni sui parametri forti nella guida di Rails Action Controller .

Nota : se si desidera ancora utilizzare attr_accessible, è necessario aggiungere protected_attributesal tuo Gemfile. Altrimenti, dovrai affrontare a RuntimeError.


1
Il documento non diceva che attr_accessibledoveva essere rimosso. Cosa succederà se lo manteniamo?
Lulalala,

12
Riceverai un errore se non apporti alcune modifiche al tuo 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.
utente

6
Ottima spiegazione Sembra in pratica, tuttavia, che allontana Rails dal modello fat, dal controller thin, ecc., Verso modelli thin e controller davvero gonfiati. Devi scrivere tutte queste cose per ogni istanza, non leggono bene e annidare sembra essere una seccatura. Il vecchio attr_accessible / attr_accessor nel sistema modello non era rotto e non aveva bisogno di essere riparato. Un post sul blog è diventato troppo popolare in questo caso.
rcd

1
Non è necessario gestire i parametri consentiti nei controller. In realtà è una violazione del principio della responsabilità singola. Dai un'occhiata al seguente post sul blog edelpero.svbtle.com/strong-parameters-the-right-way
Pierre-Louis Gottfrois,

3
Api così gimmiky e che cambiano spesso, insieme a una nuova pedante, sprecano molte ore di sviluppo in un altro doloroso aggiornamento di Rails :-(
Brian Takita,

22

Se preferisci attr_accessible, puoi usarlo anche in Rails 4. Dovresti installarlo come un gioiello:

gem 'protected_attributes'

dopodiché potresti usare attr_accessible nei tuoi modelli come in Rails 3

Inoltre, e penso che sia il modo migliore: utilizzare gli oggetti modulo per gestire l'assegnazione di massa e salvare gli oggetti nidificati, e puoi anche usare gemelli_attribuiti protetti in quel modo

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

1
Quando usi "parametri forti", filtri i parametri nel livello del controller e non penso che questa sia la migliore idea per tutte le applicazioni. Per me il modo migliore per filtrare i parametri è usare un livello aggiuntivo. E possiamo usare la gemma "protected_attributes" per scrivere questo livello
edikgat,

4

Possiamo usare

params.require(:person).permit(:name, :age)

dove person è Model, puoi passare questo codice su un metodo person_params e utilizzare al posto di params [: person] nel metodo create o in altro metodo


2

Un aggiornamento per Rails 5:

gem 'protected_attributes' 

non sembra più funzionare. Ma dai:

gem 'protected_attributes_continued'

un tentativo.


1

1) Aggiorna Devise in modo che possa gestire Rails 4.0 aggiungendo questa linea al Gemfile dell'applicazione:

gem 'devise', '3.0.0.rc' 

Quindi eseguire:

$ bundle

2) Aggiungi la vecchia funzionalità di attr_accessiblenuovo a Rails 4.0

Prova a usare attr_accessiblee non commentarlo.

Aggiungi questa riga al Gemfile dell'applicazione:

gem 'protected_attributes'

Quindi eseguire:

$ bundle
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.