Вы получаете ArgumentError: wrong number of arguments (1 for 0)
, потому что to_json
необходимо переопределить одним параметром, хэш options
.
def to_json(options)
...
end
Более подробное объяснение to_json
, as_json
и рендеринг:
В ActiveSupport 2.3.3 добавлено as_json
для решения проблем, подобных той, с которой вы столкнулись. создание json должно быть отделено от рендеринга json.
Теперь в любое время to_json
вызывается для объекта, as_json
вызывается для создания структуры данных, а затем этот хэш кодируется в виде строки JSON с использованием ActiveSupport::json.encode
. Это происходит для всех типов: объект, число, дата, строка и т. Д. (См. Код ActiveSupport).
Объекты ActiveRecord ведут себя одинаково. Существует реализация по умолчанию as_json
, которая создает хэш, включающий все атрибуты модели. Вы должны переопределить as_json
в вашей модели, чтобы создать желаемую структуру JSON . as_json
, так же, как и старый to_json
, принимает хеш опций, в котором вы можете указать атрибуты и методы для включения декларативного.
def as_json(options)
# this example ignores the user's options
super(:only => [:email, :handle])
end
В вашем контроллере render :json => o
может принимать строку или объект. Если это строка, она передается как тело ответа, если это объект, вызывается to_json
, что вызывает as_json
, как объяснено выше.
Итак, если ваши модели правильно представлены с as_json
переопределениями (или нет), код вашего контроллера для отображения одной модели должен выглядеть следующим образом:
format.json { render :json => @user }
Мораль этой истории такова: Не звоните to_json
напрямую, позвольте render
сделать это за вас. Если вам нужно настроить вывод JSON, позвоните as_json
.
format.json { render :json =>
@user.as_json(:only => [:username], :methods => [:avatar]) }