Как 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
ключевые слова не требуют пояснений, но на всякий случай, вы можете найти более подробную информацию о strong parameters в направляющей контроллера действия Rails.
Примечание: если вы все еще хотите использовать 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 является моделью, вы можете передать этот код на метод person_params и использовать вместо params [: person] в create method или в другом методе
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
обновление для Rails 5:
gem 'protected_attributes'
похоже, больше не работает. Но дайте:
gem 'protected_attributes_continued'
попробовать.