Оновлення:
Ця проблема не була належним чином вивчена. Справжня проблема криється всередині 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
методи очікують аргументи?