Rails - attr_accessible & массовое назначение - PullRequest
3 голосов
/ 04 июня 2009

У меня есть вопрос об использовании attr_accessible в Rails.

Иногда я хочу установить guard_protected_attributes на false, чтобы обойти защиту массового назначения. Мне интересно, почему следующая строка не работает (она создает ошибку «не удается преобразовать ключи»):

@user.attributes=({ :name => "James Bond", :admin => true }, false)

... но это так:

@user.send(:attributes=, { :name => "James Bond", :admin => true }, false)

Кто-нибудь знает причину?

Ответы [ 4 ]

6 голосов
/ 04 июня 2009

Поскольку анализатор Ruby анализирует '{ :name => "James Bond", :admin => true}, false' как single аргумент для #attributes=. Вызов метода 'foo=' ограничивает вас одним аргументом в Ruby. send обходит это.

На самом деле происходит то, что Rails пытается структурировать ключи false, которые, будучи FalseClass, а не Hash, не имеют их.

1 голос
/ 03 мая 2012

В более поздних версиях ActiveRecord был удален второй параметр к атрибутам =. Теперь вы можете звонить с тем же эффектом:

model.assign_attributes(attributes, :without_protection => true)
1 голос
/ 07 января 2011

Я просто определил некоторые вспомогательные методы, чтобы сделать обход ограничений массового назначения немного проще.

module ActiveRecord
  class Base

    # Assigns attributes while ignoring mass assignment protection
    def force_feed(attributes)
      self.send(:attributes=, attributes, false)
      self
    end

  end
end
1 голос
/ 31 августа 2009

Я хочу посмотреть, если вы, ребята, последуете за этим, поэтому я должен использовать .send или есть лучший подход?

...