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 или есть лучший подход?

Другие вопросы по тегам