2010-10-06 6 views
5

В рельсах, при обновлении модели, как предотвратить некоторые свойства модели от обновления при использовании вызова, как:Запретить обновление некоторых свойств?

@user.update_profile params[:user] 

Поскольку любой человек может просто создать форму ввод с именем, как «пароль» , как вы можете отфильтровать набор свойств, которые вы позволяете обновлять?

Это для чего для attr_XXX?

+1

Whitelist против черного списка, рекомендуется белый список. – Swanand

ответ

6

Вы ищете attr_accessible. Он позволяет указать, какие атрибуты можно задать с помощью массового обновления (например, update_attributes), но вы все равно сможете установить атрибуты «вручную» (то есть @user.attribute = ...).

Для получения дополнительной информации см. The importance of attr_accessible in Ruby on Rails.

+0

ok, чтобы предотвратить массовые обновления во время сообщений в форме и т. Д., Верно? – Blankman

+0

@Blankman Правильно, любые атрибуты, которые не указаны как доступные, не будут обновляться через 'params'. –

4

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

class User < ActiveRecord::Base 
    attr_protected :password 
end 

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

N.B Защищенные атрибуты могут все еще быть перезаписаны, если он непосредственно назначен как в

@user.password = "not secure" 
+2

Обратите внимание, что 'attr_protected' и' attr_accessible' (что я упомянул в моем ответе) являются двумя сторонами одной и той же монеты. 'attr_accessible' заставляет вас перечислять атрибуты, которые вы ** хотите **, чтобы иметь возможность обновления навалом; 'attr_protected' перечисляет атрибуты, которые вы ** не хотите ** обновлять. –

+0

Однако при использовании 'attr_accessible', если вы когда-либо добавляете больше атрибутов в свою модель, вам не придется беспокоиться о том, что они доступны, если вы не укажете их как таковые; с 'attr_protected', любые новые атрибуты будут доступны. Конечно, правильный ответ зависит от того, что вы ожидаете (хотя некоторые считают, что предпочтительнее явно перечислять то, что вы хотите, чтобы не было никаких сюрпризов). –

+0

@ Daniel Vandersluis: Да Это правда. Белый список с attr_accessible - это гораздо лучшая стратегия безопасности, чем черная листинг с attr_protected. Но способ формулирования вопроса подразумевал, что подход черного списка был предпочтительным. – EmFi

Смежные вопросы