Спасибо Самуэлькадольфу за помощь, оказанную мне сегодня на IRC-канале #rubyonrails.Он предоставил решение в этой сути , скопированное ниже для удобства:
def custom_respond_with(*resources, &block)
options = resources.extract_options!
if options[:callback]
old_block = block
block = lambda do |format|
old_block.call(format) if block_given?
format.json { render :json => [] }
end
end
respond_with(*(resources << options), &block)
end
Я еще не пробовал это в своем приложении, но вижу, что оно должно работать.Он также подтвердил, что я могу аналогичным образом переопределить сам метод respond_with
, просто изменив название этого метода и изменив последнюю строку определения на super(*(resources << options), &block)
.
Я думаю, что это будет работать для меня.Тем не менее, мне все еще интересно знать, как написать собственный респондент для выполнения этой работы.(Это было бы более элегантное решение, ИМХО.)
Обновление: Я попробовал это в своем приложении, и оно работает с некоторыми незначительными изменениями.Вот версия, которую я сейчас использую в разделе private
моего ApplicationController, предназначенная для автоматического предоставления опции :callback => params[:callback]
для запросов JSON:
def custom_respond_with(*resources, &block)
options = resources.extract_options!
if params[:callback]
old_block = block
block = lambda do |format|
old_block.call(format) if block_given?
format.json { render :json => resources, :callback => params[:callback] }
end
end
respond_with(*(resources << options), &block)
end
Обратите внимание, что мне пришлось изменить if options[:callback]
на if params[:callback]
, чтобы заставить его работать.