attr_accessible
, похоже, больше не работает в моей модели.
Как можно разрешить массовое назначение в Rails 4?
attr_accessible
, похоже, больше не работает в моей модели.
Как можно разрешить массовое назначение в Rails 4?
Rails 4 теперь использует строгие параметры.
Защита атрибутов теперь выполняется в контроллере. Это пример:
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
private
def person_params
params.require(:person).permit(:name, :age)
end
end
Больше не нужно указывать attr_accessible
в модели.
accepts_nested_attributes_for
Чтобы использовать accepts_nested_attribute_for
со строгими параметрами, вам нужно указать, какие вложенные атрибуты должны быть внесены в белый список.
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
Ключевые слова говорят сами за себя, но на всякий случай вы можете найти дополнительную информацию о строгих параметрах в руководстве Rails Action Controller < / а>.
Примечание. Если вы все еще хотите использовать attr_accessible
, вам необходимо добавить protected_attributes
в свой Gemfile
. В противном случае вы столкнетесь с RuntimeError
.
attr_accessible
необходимо удалить. Что будет, если мы его сохраним?
- person lulalala; 11.09.2013
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.
- person user; 25.09.2013
strong_params
. Но что, если вложенная модель также имеет вложенные атрибуты для третьей модели? Где мне нужно указать атрибуты для этой третьей модели, чтобы попасть в белый список?
- person alexventuraio; 19.10.2016
Если вы предпочитаете attr_accessible, вы можете использовать его и в Rails 4. Вы должны установить его как gem:
gem 'protected_attributes'
после этого вы можете использовать attr_accessible в своих моделях, как в Rails 3
Кроме того, и я думаю, что это лучший способ - использовать объекты формы для работы с массовым назначением и сохранять вложенные объекты, и вы также можете использовать гем protected_attributes таким образом
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
Мы можем использовать
params.require(:person).permit(:name, :age)
где person - модель, вы можете передать этот код в метод person_params и использовать вместо params [: person] в методе create или в методе else
Обновление для Rails 5:
gem 'protected_attributes'
похоже, больше не работает. Но дайте:
драгоценный камень "protected_attributes_continued"
попытка.
1) Обновите Devise, чтобы он мог обрабатывать Rails 4.0, добавив эту строку в Gemfile вашего приложения:
gem 'devise', '3.0.0.rc'
Затем выполните:
$ bundle
2) Снова добавить старую функциональность attr_accessible
в rails 4.0
Попробуйте использовать attr_accessible
и не комментируйте это.
Добавьте эту строку в Gemfile вашего приложения:
gem 'protected_attributes'
Затем выполните:
$ bundle