Почему response_with не возвращает json из моей модели? - PullRequest
7 голосов
/ 18 августа 2011

Почему в этом случае не отвечает response_with json?Я вызываю действие с явным .json (/tasks/4e3c1163a19d461203000106/items/4e4c27dfa19d46e0e400000a.json)

В моем контроллере -

class Tasks::TasksController < Tasks::BaseController
  respond_to :html, :js, :json

  def update
    @task = @taskgroup.update_task(params[:id], params[:task])
    @taskgroup.save
    respond_with @task
  end
end

Когда я переопределил to_json и добавилточка останова, это не удар.Ответ:

{}

Если я заменим response_with явным вызовом to_json:

respond_with @task do |format|
  format.json { render json: @task.to_json }
end

Ответ идеален:

{
"_id":"4e4c27dfa19d46e0e400000a",
"assigned_to":null,
"comments"  [{"_id":"4e4c2fd7a19d46e127000014", 
[SNIP]

Работает нормальнов последнем случае, но я хотел бы выяснить, почему первый не работает.Это происходит для других контроллеров и моделей в моем приложении.Не уверен, что это вещь монгоид?(рельсы 3.0.9 / mongoid 2.1.8)

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Вот обезьяна-патч, которую я написал, чтобы всегда отвечать_ с тем, что вы говорите, делать независимо от протокола. Имейте в виду, что это нарушает лучшие практики RESTful, и если вы отвечаете Rwful способом, тогда это может нарушиться. Однако если ваши ответы JSON / XML отделены от основного приложения, то это полезно, а другие контроллеры не сломаться.

Использование, включите это в любой контроллер, чтобы переопределить функцию response_with.

class ApiController < BaseController
  include ValidResponder
end

Тогда все, что расширяет ApiController, будет включать эту функцию.

Сохраните следующее в app / lib / valid_responder.rb:

#Override restful responses.
module ValidResponder
  def self.included(base)
    ActionController::Responder.class_eval do
      alias :old_api_behavior :api_behavior
      define_method :api_behavior do |error|
        if controller.class.ancestors.include?(base)
          raise error unless resourceful?
          display resource
        else
          old_api_behaviour(error)
        end
      end
    end
  end
end

Для справки, фактический источник метода доступен здесь: http://api.rubyonrails.org/classes/ActionController/Responder.html#method-i-api_behavior

1 голос
/ 19 августа 2011

Хорошо, посмотри, как это происходит. Когда вы вызываете respond_with внутри действия update, тогда (если объект действителен) он будет перенаправлен на действие show (если вы не хотите использовать это поведение по умолчанию, вы должны указать от location: "other_action" до respond_with).

...