2009-06-04 2 views
3

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

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

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

... но это делает:

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

Любой знаю причина?

ответ

6

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

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

+0

Спасибо, это сводило меня с ума! – fig

+0

Я действительно провел несколько тестов в IRB. Единственный аргумент - это массив, который также не может сжимать свои ключи. –

+1

Только один раз, когда я хочу, чтобы массив сжал его ключи. – fig

1

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

1

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

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

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

model.assign_attributes(attributes, :without_protection => true) 
Смежные вопросы