Примечание : если вы все еще хотите использовать attr_accessible, вам нужно добавить protected_attributesв свой Gemfile. В противном случае вы столкнетесь с RuntimeError.
В документе не сказано, что attr_accessibleнужно удалить. Что будет, если мы сохраним это?
Лулалала
12
Вы получите ошибку, если не внесете некоторые изменения в свой 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.
Пользователь
6
Отличное объяснение. Тем не менее, на практике это отодвигает Rails от толстой модели, тонкого контроллера и т. Д., К тонким моделям и действительно раздутым контроллерам. Вы должны писать все эти вещи для каждого экземпляра, они не читаются хорошо, а вложение кажется болезненным. Старый attr_accessible / attr_accessor в модельной системе не был сломан и не нуждался в исправлении. В этом случае одно сообщение в блоге стало слишком популярным.
узо
1
Вам не нужно обрабатывать разрешенные параметры в ваших контроллерах. На самом деле это нарушение принципа единой ответственности. Взгляните на следующее сообщение в блоге edelpero.svbtle.com/strong-parameters-the-right-way
Пьер-Луи Готфруа
3
Так что трюки и часто меняющиеся API в сочетании с новой педантикой тратят много часов на разработку еще одного болезненного обновления Rails :-(
Brian Takita
22
Если вы предпочитаете attr_accessible, вы можете использовать его и в Rails 4. Вы должны установить его как gem:
gem 'protected_attributes'
после этого вы можете использовать attr_accessible в ваших моделях, как в Rails 3
Кроме того, и я думаю, что это лучший способ - использовать объекты форм для работы с массовым присваиванием и сохранения вложенных объектов, и вы также можете использовать gem protected_attributes таким образом
classNestedForm
include ActiveModel::MassAssignmentSecurity
attr_accessible :name,:telephone, as::create_params
def create_objects(params)SomeModel.new(sanitized_params(params,:create_params))endend
Когда вы используете «сильные параметры», вы фильтруете параметры на уровне контроллера, и я не думаю, что это лучшая идея для всех приложений. Для меня лучший способ фильтрации параметров - использовать дополнительный слой. И мы можем использовать гем 'protected_attributes', чтобы написать этот слой
edikgat
4
Мы можем использовать
params.require(:person).permit(:name,:age)
где person это Model, вы можете передать этот код в методе person_params и использовать вместо params [: person] в методе create или методе else
attr_accessible
нужно удалить. Что будет, если мы сохраним это?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.
Если вы предпочитаете attr_accessible, вы можете использовать его и в Rails 4. Вы должны установить его как gem:
после этого вы можете использовать attr_accessible в ваших моделях, как в Rails 3
Кроме того, и я думаю, что это лучший способ - использовать объекты форм для работы с массовым присваиванием и сохранения вложенных объектов, и вы также можете использовать gem protected_attributes таким образом
источник
Мы можем использовать
где person это Model, вы можете передать этот код в методе person_params и использовать вместо params [: person] в методе create или методе else
источник
Обновление для Rails 5:
кажется, больше не работает. Но дайте:
драгоценный камень 'protected_attributes_continued'
попытка
источник
1) Обновите Devise, чтобы он мог обрабатывать Rails 4.0, добавив эту строку в Gemfile вашего приложения:
Затем выполните:
2) Добавить старый функционал
attr_accessible
снова в рельсы 4.0Попробуйте использовать
attr_accessible
и не комментируйте это.Добавьте эту строку в Gemfile вашего приложения:
Затем выполните:
источник