2015-06-16 4 views
2

я извлекал массовую уязвимость присваивания ниже линии:Сильные PARAMS в рельсах

friend = Friend.find(params[:id]) 
friend.update_attributes(params[:name]) 

переписав его как:

friend = Friend.find(params[:id]) 
friend.update_attributes(params.permit(:name)) 

Но это дало мне эту ошибку:

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes for Friend: name): 
Unpermitted parameters: id 

Любая идея, почему я получаю эту ошибку?

Edit :

Я добавил attr_accessible :status_id и params.permit(:id, :name) и ошибка был удален. Но добавляет attr_accessible правильный способ сделать это, поскольку мы пишем сильные параметры, чтобы удалить эту строку, не так ли?

+0

У вас есть 'attr_accessible' в вашей модели? –

+0

Показать 'params.inspect'. Убедитесь, что вы проверяете правильную часть кода - возможно, вы редактируете метод обновления, но запускаете метод создания. – Astery

+0

'params.permit (: name,: id)' –

ответ

0

Попробуйте обновить код friend.update_attributes(params.permit(:name, :id)) , чтобы разрешить этот параметр.

+0

Не работает. Получение этой «ActiveModel :: MassAssignmentSecurity :: Ошибка» (не может назначать защищенные атрибуты для друга: id, name) ' – Hellboy

+0

См. Edit – Hellboy

0

вы должны сделать

friend.update_attributes(params.require(:friend).permit(:name)) 

или поместить это в частный метод

private 
def object_params 
    params.require(:friend).permit(:name) 
end 

, а затем вызвать через

friend.update_attributes object_params 

редактирования: я предполагаю, что ваши PARAMS выглядеть подобные

{friend:{name:'xxxxx'},id:xx} 
+0

Я не могу сделать это, поскольку получаю параметры как названные' params' из передний конец. – Hellboy

+0

снова посмотрим на пример. Я просто помещаю params в метод частного контроллера. :). вы можете использовать allready this 'friend.update_attributes (params.require (: friend) .permit (: name))' – rob

+0

Ваше предположение неверно, мои параметры выглядят так: 'params = {" name "=>" John "," id "=>" 15 "}' – Hellboy

0

Не записывайте attr_accessible в модели, Rails 4 использует сильный параметр.

Попробуйте этот код.

friend = Friend.find(params[:id]) 
friend.update_attributes(friend_params) 

private 

    def friend_params  
    params.require(:friend).permit!  
    end 
+0

Как я уже сказал, я получаю свои параметры как 'params', а не как' friend' – Hellboy

+0

Как вы получаете параметры друга, поэтому вам нужно потребовать от друга разрешить параметры модели fiend. Работает ли мой код? – Chitra

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