attr_accessible
sembra non funzionare più nel mio modello.
Qual è il modo per consentire l'assegnazione di massa in Rails 4?
attr_accessible
sembra non funzionare più nel mio modello.
Qual è il modo per consentire l'assegnazione di massa in Rails 4?
Risposte:
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_accessible
il modello.
accepts_nested_attributes_for
Per utilizzare accepts_nested_attribute_for
con 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_attributes
al tuo Gemfile
. Altrimenti, dovrai affrontare 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.
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
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
Un aggiornamento per Rails 5:
gem 'protected_attributes'
non sembra più funzionare. Ma dai:
gem 'protected_attributes_continued'
un tentativo.
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_accessible
nuovo a Rails 4.0
Prova a usare attr_accessible
e non commentarlo.
Aggiungi questa riga al Gemfile dell'applicazione:
gem 'protected_attributes'
Quindi eseguire:
$ bundle
attr_accessible
doveva essere rimosso. Cosa succederà se lo manteniamo?