Как доступен attr, используемый в Rails 4?
attr_accessible
кажется, больше не работает в моей модели.
как можно разрешить массовое назначение в Rails 4?
5 ответов:
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
ключевые слова не требуют пояснений, но на всякий случай, вы можете найти дополнительную информацию о сильных параметрах в направляющей контроллера действия рельсов.
Примечание: если вы все еще хотите использовать
attr_accessible
, вам необходимо добавитьprotected_attributes
наGemfile
. В противном случае, вы столкнетесь сRuntimeError
.
Если вы предпочитаете attr_accessible, вы можете использовать его в Rails 4 тоже. Вы должны установить его как драгоценный камень:
gem 'protected_attributes'
после этого вы могли бы использовать attr_accessible в вас модели, как в Rails 3
кроме того, и я думаю, что это лучший способ - использование объектов формы для работы с массовым назначением и сохранения вложенных объектов, а также вы можете использовать protected_attributes gem таким образом
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_params & использовать вместо params [: person] в create method или else method
1) обновите Devise, чтобы он мог обрабатывать Rails 4.0, добавив эту строку в Gemfile вашего приложения:
gem 'devise', '3.0.0.rc'
выполнить:
$ bundle
2) Добавьте старую функциональность
attr_accessible
снова в рельсы 4.0попробуйте использовать
attr_accessible
и не комментируйте это.добавьте эту строку в Gemfile вашего приложения:
gem 'protected_attributes'
выполнить:
$ bundle