Ну, похоже, ваши ключи params [: person] похожи на поля вашей модели.Так почему бы вам просто не передать params[:person]
update_all
?
В качестве альтернативы, вы можете создать хеш person
, инициализировать его так, как вы хотите, а затем передать его update_all
person = { :name => params[:person][:name] ,
...
if params[:person][:avatar]
person[:avatar] = params[:person][:avatar].original_filename
end
Person.update(params[:id], person)
Я изменил update_all
на update
, потому что update_all
используется для обновления всех записей (соответствующих условию), тогда как update
находит запись по ее идентификатору.
Но опять же, это плохая практика, и вам приходится вводить много ненужного кода.
Еще одна вещь.update_all
делает прямой вызов БД, который не включает проверки, обратные вызовы и т. Д. Итак, если у вас нет особых причин для этого, вам лучше сделать что-то вроде этого:
@person = Person.find params[:id]
@person.update_attributes params[:person]
Я действительно думаю, что вы должны проверить эту книгу из
Обновлен еще раз:)
Видите ли, такие вещи принадлежат вашим моделям,не контроллеры.Вы можете определить сеттер в модели:
def avatar=(value)
write_attribute(:avatar, value.original_filename)
end