Как доступен attr, используемый в Rails 4?


attr_accessible кажется, больше не работает в моей модели.

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

5 251

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

обновление для Rails 5:

gem 'protected_attributes' 

кажется, больше не работают. Но дайте:

gem 'protected_attributes_continued'

попробовать.