Як attr_accessible використовується в Rails 4?


Відповіді:


447

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. В іншому випадку ви зіткнетеся з a RuntimeError.


1
У документі не сказано, що його attr_accessibleпотрібно видалити. Що буде, якщо ми його збережемо?
lulalala

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.
користувач

6
Чудове пояснення. Здається, як на практиці, однак, це відсуває Рейки від жирової моделі, тонкого контролера тощо, до тонких моделей і дійсно роздутих контролерів. Ви повинні написати цей матеріал для кожного примірника, він не добре читається, а вкладення, здається, є болем. Старий attr_accessible / attr_accessor в модельній системі не був зламаний і його не потрібно було виправляти. Один допис у блозі отримав надто популярну в цьому випадку.
rcd

1
Вам не доведеться обробляти дозволені параметри у контролерах. Насправді це порушення принципу єдиної відповідальності. Подивіться наступне повідомлення в блозі edelpero.svbtle.com/strong-parameters-the-right-way
П'єр-Луї Готфруа

3
Тож gimmiky & часто змінюється apis у поєднанні з новонаведеною педантикою витрачає багато годин розробника на ще одне болісне оновлення Rails :-(
Brian Takita

22

Якщо ви віддаєте перевагу attr_accessible, ви можете використовувати його і в Rails 4. Ви повинні встановити його як дорогоцінний камінь:

gem 'protected_attributes'

після цього ви можете використовувати attr_accessible у ваших моделях, як у Rails 3

Крім того, і я вважаю, що це найкращий спосіб - використання об'єктів форми для роботи з масовим призначенням та збереження вкладених об'єктів, і ви також можете використовувати захищений gattributes 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

1
Коли ви використовуєте "сильні параметри", ви фільтруєте параметри в рівні контролера, і я не думаю, що це найкраща ідея для всіх програм. Для мене найкращим способом фільтрації параметрів є використання додаткового шару. І ми можемо використовувати дорогоцінний камінь 'protected_attributes' для написання цього шару
edikgat

4

Ми можемо використовувати

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

де person є Model, ви можете передати цей код методу person_params & використовувати замість params [: person] у методі create або іншому методі


2

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

gem 'protected_attributes' 

схоже, більше не працює. Але дайте:

gem 'protected_attributes_continued'

спробувати.


1

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.