Как attr_accessible используется в Rails 4?

247

attr_accessible, похоже, больше не работает в моей модели.

Как разрешить массовое присвоение в Rails 4?

Теги:
ruby-on-rails-4

4 ответа

457
Лучший ответ

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.

Примечание. Если вы все еще хотите использовать attr_accessible, вам нужно добавить protected_attributes к вашему Gemfile. В противном случае вы столкнетесь с RuntimeError.

  • 1
    В документе не сказано, что 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.
Показать ещё 5 комментариев
21

Если вы предпочитаете attr_accessible, вы можете использовать его и в Rails 4. Вы должны установить его как драгоценный камень:

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
  • 1
    Когда вы используете «сильные параметры», вы фильтруете параметры на уровне контроллера, и я не думаю, что это лучшая идея для всех приложений. Для меня лучший способ фильтрации параметров - использовать дополнительный слой. И мы можем использовать гем 'protected_attributes', чтобы написать этот слой
4

Мы можем использовать

params.require(:person).permit(:name, :age)

где человек является Model, вы можете передать этот код по методу person_params и использовать вместо params [: person] в методе create или иначе

1

1) Update 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню