Оновлення:
Ця проблема не була належним чином вивчена. Справжня проблема криється всередині render :json.
Перша вставка коду в оригінальному питанні дасть очікуваний результат. Однак тут ще є застереження. Дивіться цей приклад:
render :json => current_user
це НЕ те саме, що
render :json => current_user.to_json
Тобто не render :jsonбуде автоматично викликати to_jsonметод, пов'язаний з об'єктом User. Насправді , якщо to_jsonце замінено на Userмоделі, render :json => @userбуде створено ArgumentErrorописане нижче.
резюме
# works if User#to_json is not overridden
render :json => current_user
# If User#to_json is overridden, User requires explicit call
render :json => current_user.to_json
Мені все це здається безглуздо. Це, здається, говорить мені, що renderнасправді не викликає, Model#to_jsonколи :jsonвказано тип . Хтось може пояснити, що насправді тут відбувається?
Будь-який геній, який може мені допомогти в цьому, може відповісти на інше моє запитання: Як створити відповідь JSON, комбінуючи @ foo.to_json (options) та @ bars.to_json (options) у Rails
Оригінальне запитання:
Я бачив деякі інші приклади щодо SO, але жоден не робить те, що шукав.
Я намагаюсь:
class User < ActiveRecord::Base
# this actually works! (see update summary above)
def to_json
super(:only => :username, :methods => [:foo, :bar])
end
end
Я отримую ArgumentError: wrong number of arguments (1 for 0)в
/usr/lib/ruby/gems/1.9.1/gems/activesupport-2.3.5/lib/active_support/json/encoders/object.rb:4:in `to_json
Якісь ідеї?
usernameце не метод , а fooй barне вимагають методів. Я оновив своє запитання, щоб показати, де відбувається помилка.
username,fooабоbarметоди очікують аргументи?