Rails - attr_accessible & массовое назначение
У меня есть вопрос об использовании attr_accessible
в рельсах.
Я иногда хочу установить guard_protected_attributes
в false
чтобы обойти массовое присвоение защиты. Мне интересно, почему следующая строка не работает (она создает ошибку "not stringify keys"):
@user.attributes=({ :name => "James Bond", :admin => true }, false)
... но это делает:
@user.send(:attributes=, { :name => "James Bond", :admin => true }, false)
Кто-нибудь знает причину?
4 ответа
Потому что парсер Ruby разбирает{ :name => "James Bond", :admin => true}, false
в качестве единственного аргумента #attributes=
, Вызов методаfoo=
ограничивает вас одним аргументом в Ruby. send
обходит это.
На самом деле происходит то, что Rails пытается структурировать ключи false
, который, будучи FalseClass
а не Hash
не имеет.
В более поздних версиях ActiveRecord был удален второй параметр к атрибутам =. Теперь вы можете звонить с тем же эффектом:
model.assign_attributes(attributes, :without_protection => true)
Я просто определил некоторые вспомогательные методы, чтобы немного упростить обход ограничений массового назначения.
module ActiveRecord
class Base
# Assigns attributes while ignoring mass assignment protection
def force_feed(attributes)
self.send(:attributes=, attributes, false)
self
end
end
end
Я хочу посмотреть, следите ли вы, ребята, за этим, поэтому я должен использовать.send или есть лучший подход?