Сильные параметры и attr_accessible
- это два разных способа добавления защитных средств к функции «массового присвоения» Rails. Сильные параметры - это способ, который предписывается текущей версией Rails.
«Массовое присвоение» - это удобная стрижка в Rails, которая позволяет вам установить множество свойств модели в одном выражении.
Например, представьте, что у вас есть @user
, который вы хотите обновить данными из представления формы. Без массового назначения, вам придется писать утомительный код, как это:
@user.first_name = params[:user][:first_name]
@user.last_name = params[:user][:last_name]
@user.phone_number = params[:user][:phone_number]
...
@user.save
и так далее для каждого поля формы.
С массовым назначением, все, что код становится одной строкой:
@user.update(params[:user])
Но это дырявая безопасности. Так как params
содержит все данные, предоставленные браузером, злоумышленник может добавлять данные к этому представлению, чего вы не ожидали. Например, они могут добавить к параметрам is_admin=1
. Если у вас есть столбец базы данных is_admin
, тогда массовое задание просто позволит пользователю перейти на администратора. Хлоп!
Здесь вы найдете сильные параметры. С сильными параметрами Rails поднимет ActiveModel::ForbiddenAttributesError
, если вы попытаетесь сделать наивный update(params[:user])
. Вместо этого вам нужно четко указать, какие параметры вы ожидаете от представления браузера, используя помощники require
и permit
, которые предоставляют сильные параметры. Например:
def user_params
# Note that :is_admin is not permitted!
params.require(:user).permit(:first_name, :last_name, :phone_number)
end
...
@user.update(user_params)
Я не могу говорить для сопровождающих Rails, но мне нравятся сильные параметры, потому что они гибкие. Если у меня есть несколько действий в контроллере пользователей, которые ожидают разные параметры, я могу легко описать с помощью permit
параметры, которые должны быть разрешены.
Или, если у меня есть разные роли пользователей, которым разрешено обновлять разные атрибуты, я могу легко смоделировать эти разрешения. Как уже упоминалось в CV CV, вы даже можете изменить эти разрешения во время выполнения, что является мощным.
Короче говоря, гибкость сильных параметров обусловлена тем, что вы можете определить способ user_params
в любом месте и, как вам нравится. У вас есть все возможности концепций Ruby и OO, чтобы они работали так, как вы хотите.
Что относительно attr_accessible
?
Не вдаваясь в излишние подробности (так как эта функция больше не поддерживается Rails): вместо того, чтобы использовать метод permit
, вы могли бы сделать что-то подобное, используя attr_accessible
макрос в самой модели, как это:
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :phone_number
...
end
Так что для простых случаев он очень похож на Сильные параметры; вы просто определяете список атрибутов в другом месте.
Однако, поскольку attr_accessible
тесно связан с определением класса модели, вы теряете большую гибкость.Что делать, если у вас есть два разных действия контроллера, которые должны выполнять массовое присвоение для той же модели User
? Теперь вы застряли.
attr_accessor
attr_accessor
макрос встроен в Ruby, и не имеет ничего общего с Rails, массовое присвоение или безопасности. Это просто похоже на аналогичное имя. :)