Как attr_accessible используется в Rails 4?
attr_accessible
Кажется, больше не работает в моей модели.
Как можно разрешить массовое назначение в Rails 4?
6 ответов
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
,
Если вы предпочитаете attr_accessible, вы можете использовать его и в Rails 4. Вы должны установить его как gem:
gem 'protected_attributes'
после этого вы можете использовать attr_accessible в ваших моделях, как в Rails 3
Кроме того, и я думаю, что это лучший способ - использовать объекты форм для работы с массовым присваиванием и сохранения вложенных объектов, и вы также можете использовать gem 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
Обновление для Rails 5:
gem 'protected_attributes'
кажется, больше не работает. Но дайте:
драгоценный камень 'protected_attributes_continued'
попытка
Мы можем использовать
params.require(:person).permit(:name, :age)
где person это Model, вы можете передать этот код в методе person_params и использовать вместо params[:person] в методе create или методе else
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 с 3.2 на 6.1, поэтому даже гем "protected_attributes" не подходил. Я ценю аргументы в пользу использования require(). Allow () в контроллере, но я не хотел повторно вводить или вырезать и вставлять все эти атрибуты из моделей, поэтому я решил вместо этого использовать этот код инициализатора (поместить в файл в конфиге / инициализаторах):
# fix attr_accessible in an initializer
# wrap ActionController::Parameters code in singleton method defined
# from attr_accessible so controller code can call class method
# to get permitted parameter list
# e.g. model: class A < ActiveRecord::Base,
# controller calls A.permit_attr(params)
# lots simpler than moving all attr_accessible definitions to controllers
# bug: fails if more than one attr_accessible statement
def (ActiveRecord::Base).attr_accessible *fields
puts "attr_accessible:"+self.name+":permitted_params fields=#{fields.inspect}"
define_singleton_method("permit_attr") { |params|
# may have subclasses where attr_accessible is in superclass
# thus must require by subclass name so should calculate require at runtime
rq = self.name.downcase.to_sym
puts "...permit_attr:self=#{rq} permit(#{fields.inspect})"
params.require(rq).permit(fields)
}
end