Сильные параметры в рельсах

Я удалил уязвимость массового назначения следующей строки:

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 правильным способом сделать это, поскольку мы пишем сильные параметры для удаления этой строки, не так ли?


person Hellboy    schedule 16.06.2015    source источник
comment
У вас есть attr_accessible в вашей модели?   -  person j-dexx    schedule 16.06.2015
comment
Показать params.inspect. Убедитесь, что вы проверяете правильную часть кода — возможно, вы редактируете метод обновления, но вызываете метод создания.   -  person Astery    schedule 16.06.2015
comment
Я удалил attr_accessible из своей модели, и params.permit(:name, :id) не работает   -  person Hellboy    schedule 16.06.2015
comment
Один из быстрых способов решить эту проблему — вообще не отправлять id из внешнего интерфейса, как вы упомянули здесь params = {"name"=>"John", "id"=>"15"}. потому что в любом случае вы не сохраняете его в базу данных   -  person Abhinay    schedule 10.07.2015


Ответы (3)


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

person WhyEnBe    schedule 16.06.2015
comment
Не работает. Получение этого ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes for Friend: id, name) - person Hellboy; 16.06.2015

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

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

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

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

а потом звонить через

friend.update_attributes object_params

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

{friend:{name:'xxxxx'},id:xx}
person rob    schedule 16.06.2015
comment
Я не могу этого сделать, так как получаю параметры с именем params из внешнего интерфейса. - person Hellboy; 16.06.2015
comment
посмотрите еще раз на пример. я просто поместил параметры в метод частного контроллера. :). вы уже можете использовать это friend.update_attributes(params.require(:friend).permit(:name)) - person rob; 16.06.2015
comment
Ваше предположение неверно, мои параметры выглядят так: params = {"name"=>"John", "id"=>"15"} - person Hellboy; 16.06.2015
comment
Ох, хорошо. Спасибо. ваша модель становится хешем с именем и идентификатором, и вы просто разрешаете имя. поэтому ошибка верна, потому что вы не хотите помещать идентификатор в update_attribute. попробуйте params.slice(:name).permit(:name) для обновления - person rob; 16.06.2015
comment
Мне все еще нужно использовать attr_accessible :name, потому что без этой строки он не работает - person Hellboy; 16.06.2015
comment
нет. это просто из-за передачи параметров, которые содержат поле, которое разрешено. вы пробовали мой последний комментарий? - person rob; 16.06.2015
comment
Да, даже твой последний комментарий не решил проблему - person Hellboy; 16.06.2015
comment
Давайте продолжим обсуждение в чате. - person rob; 16.06.2015
comment
есть еще одна подсказка (stackoverflow.com /questions/17637253/) не забудьте после этого собрать пакет. - person rob; 16.06.2015

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

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

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

private

  def friend_params    
    params.require(:friend).permit!    
  end
person Chitra    schedule 17.06.2015
comment
Как я уже сказал, я получаю свои параметры как params, а не как friend - person Hellboy; 17.06.2015
comment
Поскольку вы получаете параметры друга, вам нужно потребовать, чтобы друг разрешил параметры модели дьявола. Мой код работает? - person Chitra; 18.06.2015