attr_accessible
wydaje się, że nie działa już w moim modelu.
Jak można zezwolić na masowe przydzielanie w Rails 4?
attr_accessible
wydaje się, że nie działa już w moim modelu.
Jak można zezwolić na masowe przydzielanie w Rails 4?
Odpowiedzi:
Rails 4 używa teraz silnych parametrów .
Ochrona atrybutów jest teraz wykonywana w kontrolerze. To jest przykład:
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
private
def person_params
params.require(:person).permit(:name, :age)
end
end
Nie trzeba już ustawiać attr_accessible
w modelu.
accepts_nested_attributes_for
Aby używać accepts_nested_attribute_for
z silnymi parametrami, musisz określić, które zagnieżdżone atrybuty powinny znajdować się na białej liście.
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
Słowa kluczowe są oczywiste, ale na wszelki wypadek można znaleźć więcej informacji o mocnych parametrach w przewodniku Rails Action Controller .
Uwaga : jeśli nadal chcesz używać attr_accessible
, musisz dodać protected_attributes
do swojego Gemfile
. W przeciwnym razie będziesz mieć do czynienia z 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.
Jeśli wolisz attr_accessible, możesz użyć go również w Rails 4. Powinieneś zainstalować go jak klejnot:
gem 'protected_attributes'
potem możesz użyć attr_accessible w swoich modelach jak w Rails 3
I myślę, że to najlepszy sposób - używanie obiektów formularzy do radzenia sobie z przypisywaniem masy i zapisywanie zagnieżdżonych obiektów, a także w ten sposób można używać klejnotu chronionych atrybutów
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
Możemy użyć
params.require(:person).permit(:name, :age)
gdzie person to Model, możesz przekazać ten kod do metody person_params i użyć zamiast params [: person] w metodzie create lub metodzie
Aktualizacja dla Rails 5:
gem 'protected_attributes'
wydaje się już nie działać. Ale daj:
klejnot „protected_attributes_continued”
próba.
1) Zaktualizuj Devise, aby mógł obsługiwać Rails 4.0, dodając ten wiersz do Gemfile aplikacji:
gem 'devise', '3.0.0.rc'
Następnie wykonaj:
$ bundle
2) Dodaj starą funkcjonalność attr_accessible
ponownie do szyn 4.0
Spróbuj użyć attr_accessible
i nie komentuj tego.
Dodaj tę linię do pliku Gemfile aplikacji:
gem 'protected_attributes'
Następnie wykonaj:
$ bundle
attr_accessible
należy go usunąć. Co się stanie, jeśli go zatrzymamy?