В моем приложении на Rails 3.2 возникла проблема, когда виртуальный атрибут, отправленный в спокойном состоянии через JSON, не находится в нужном месте в хэше params. Ну, это не то, где я ожидаю. Еще неизвестно, верны ли мои ожидания. :)
У меня есть модель, использующая стандартный шаблон виртуальных атрибутов, например:
class Track < ActiveRecord::Base
def rating
# get logic removed for brevity
end
def rating=(value)
# set logic
end
def as_json(options={}) # so my method is in the JSON when I use respond_with/to_json
super(options.merge(methods: [:rating]))
end
end
JSON, отправленный на мой контроллер, выглядит следующим образом:
{"id":1,"name":"Icarus - Main Theme 2","rating":2}
Чтобы быть понятным, имя и идентификатор не являются виртуальными, рейтинг.
Я получаю это в хэше params, после того, как rails делает свою магию:
{"id"=>"1", "name"=>"Icarus - Main Theme 2", "rating"=>2, "track"=>{"id"=>"1", "name"=>"Icarus - Main Theme 2"}}
Как видите, имя и имя попадают во вложенный хэш, но рейтинг - нет. Это ожидаемое поведение? Это нарушает (несколько) стандартную практику использования вложенного хэша в контроллере, потому что вложенный хэш не содержит всех необходимых мне параметров.
Track.update(params[:id], params[:track]) # :track is missing rating
Спасибо за вашу помощь!