Замените чувствительные элементы в хэше params, чтобы избежать массового присваивания в Rails - PullRequest
0 голосов
/ 09 января 2012

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

Типичная ситуация - удалить id или user_id из params (отправляется автоматически через форму) и заменить его внутри current_user.id (в MyController # create).

Решение, которое я могу придумать, - создать объект из хэша params, затем update_attributes (родительских и дочерних объектов), чтобы заменить чувствительные атрибуты внутренними значениями:

@user = User.create(:params[:user])
@user.update_attributes(:id => current_user.id)
@user.profile.update_attributes(:user_id => current_user.id)
@user.preference.update_attributes(:user_id => current_user.id)

Есть ли более короткий / более СУХОЙ способ сказать это?

Если предпочтение, профиль и т. Д. Являются дочерними объектами пользователя (созданными с помощью метода сборки), как я могу написать метод для поиска их внешних ключей для пользователя и автоматической замены их значением, которое я передал родителю?

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 января 2012

Я сделал это в более раннем проекте, используя:

@user = User.create(params[:user]) do |user|
    user.id = current_user.id
end

Будет ли это работать для вас?

Альтернативой является проверка документов и найдите :as для атрибутов на основе ролей.

1 голос
/ 09 января 2012

Для этого предназначены attr_protected и attr_accessible ( документация ).attr_protected обеспечит вам защиту в черном списке, а attr_accessible защитит с помощью белого списка.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...