attr_accessible
начебто, більше не працює в моїй моделі.
Який спосіб дозволити масове призначення в Rails 4?
attr_accessible
начебто, більше не працює в моїй моделі.
Який спосіб дозволити масове призначення в Rails 4?
Відповіді:
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
.
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.
Якщо ви віддаєте перевагу 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
Ми можемо використовувати
params.require(:person).permit(:name, :age)
де person є Model, ви можете передати цей код методу person_params & використовувати замість params [: person] у методі create або іншому методі
Оновлення для Rails 5:
gem 'protected_attributes'
схоже, більше не працює. Але дайте:
gem 'protected_attributes_continued'
спробувати.
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
attr_accessible
потрібно видалити. Що буде, якщо ми його збережемо?