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

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

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


person user2532974    schedule 28.06.2013    source источник


Ответы (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

Ключевые слова говорят сами за себя, но на всякий случай вы можете найти дополнительную информацию о строгих параметрах в руководстве Rails Action Controller < / а>.

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

person Pierre-Louis Gottfrois    schedule 28.06.2013
comment
В документе не сказано, что attr_accessible необходимо удалить. Что будет, если мы его сохраним? - person lulalala; 11.09.2013
comment
Вы получите сообщение об ошибке, если не внесете некоторые изменения в свой 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. - person user; 25.09.2013
comment
Отличное объяснение. Однако на практике кажется, что это уводит Rails от толстых моделей, тонких контроллеров и т. Д. К тонким моделям и действительно раздутым контроллерам. Вы должны писать все это для каждого экземпляра, он плохо читается, и вложение кажется проблемой. Старый attr_accessible / attr_accessor в модельной системе не был сломан и не нуждался в исправлении. В этом случае одно сообщение в блоге стало слишком популярным. - person rcd; 01.07.2014
comment
Меня интересует преимущество сильного параметра по сравнению со старым методом attr_accessible в модели. Как здесь сказано в rcd, Rails следует толстой модели. С этим сильным параметром мы должны записать все атрибуты, которые разрешают переход, в контроллер. Мне это кажется странным. Кто-нибудь, пожалуйста, скажите мне, почему они решили пойти с сильными параметрами? - person Abhi; 19.12.2014
comment
Вам не нужно обрабатывать разрешенные параметры в ваших контроллерах. Фактически это нарушение принципа единой ответственности. Взгляните на следующую запись в блоге edelpero.svbtle.com/strong-parameters- правильный путь - person Pierre-Louis Gottfrois; 19.12.2014
comment
Так бесполезно и часто меняются apis, вкупе с новообретенной педантикой, тратят много часов разработчика на очередное болезненное обновление Rails :-( - person Brian Takita; 23.01.2015
comment
@ Pierre-LouisGottfrois Хорошее объяснение! Но что делать, если у меня есть два глубоких уровня с вложенными атрибутами? Я имею в виду, что первые вложенные атрибуты указаны в контроллере основной модели strong_params. Но что, если вложенная модель также имеет вложенные атрибуты для третьей модели? Где мне нужно указать атрибуты для этой третьей модели, чтобы попасть в белый список? - person alexventuraio; 19.10.2016

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

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
person edikgat    schedule 03.07.2014
comment
Когда вы используете «строгие параметры», вы фильтруете параметры на уровне контроллера, и я не думаю, что это лучшая идея для всех приложений. Для меня лучший способ отфильтровать параметры - использовать дополнительный слой. И мы можем использовать гем "protected_attributes", чтобы написать этот слой. - person edikgat; 16.10.2014

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

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

где person - модель, вы можете передать этот код в метод person_params и использовать вместо params [: person] в методе create или в методе else

person Hardik Hardiya    schedule 05.02.2015

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

gem 'protected_attributes' 

похоже, больше не работает. Но дайте:

драгоценный камень "protected_attributes_continued"

попытка.

person miklki14567    schedule 17.08.2018

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
person Sid    schedule 02.05.2015