В методе контроллера у меня есть:
@user = current_user
@rel = Relationship.where('user_id = ? and organization_id = ? and fish = ?', @user.id, params[:user][:default_relationship_id], true).first
@user.update_attributes(default_relationship_id: @rel.id)
Я понимаю, что последняя строка небезопасна и требует надежных параметров для предотвращения массового назначения (это означает, что пользователь также может установить любую другую переменную базы данных для этого пользователя). Но как провести рефакторинг, чтобы сделать это безопасным (в данном случае и в более общем случае)?
Если я прав, есть два способа: 1) заменить его сильными параметрами или 2) использовать метод модели.
Объявление 1) Сильные параметры:
@user.update_attributes(update_params)
private
def update_params
params.require(:user).permit(:default_relationship_id)
end
Но как это узнать, чтобы установить default_relationship_id
в @rel.id
?
Объявление 2) Добавьте его в метод модели:
@user.update_default(@rel.id) # In controller
def update_default(value) # In model file
self.update_attributes(default_relationship_id: value)
end
Но будет ли это действительно безопасным, поскольку это не метод частной модели?
Может ли кто-нибудь объяснить мой вопрос по каждому из двух подходов и, возможно, объяснить, какой подход предпочтительнее?
@rel
- person Yury Lebedev   schedule 17.08.2015@rel
основан на вводе пользователем (см. параметры, используемые в этой строке), а@rel
используется для определения значенияdefault_relationship_id
. Или это не имеет значения, и является ли возможность нежелательного массового присвоения проблемой только в том случае, если вы напрямую обновляете значение на основе пользовательского ввода (вместо косвенного способа в моем примере)? - person Marty   schedule 17.08.2015@rel.id
не основано на вводе пользователем напрямую, оно берется из базы данных - person Yury Lebedev   schedule 17.08.2015