为什么respond_with没有从我的模型返回json?

时间:2011-08-18 18:44:15

标签: ruby-on-rails-3 mongoid

为什么在这种情况下不响应_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并添加断点时,它没有被击中。答复是:

{}

如果我用显式调用to_json替换respond_with:

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

回应是完美的:

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

在后一种情况下它可以正常工作,但我想弄清楚为什么第一个不起作用。这适用于我的应用程序中的其他控制器和模型。不确定它是否是一个mongoid的东西? (rails 3.0.9 / mongoid 2.1.8)

2 个答案:

答案 0 :(得分:3)

这是我写的一个monkeypatch总是回应你告诉它做什么而不管协议。 请注意,这确实会破坏RESTful最佳实践,如果您以RESTful方式响应,则可能会中断。但是,如果您的JSON / XML响应与主应用程序分开,那么它很有用,而您的其他控制器将会不要休息。

用法,将其包含在任何控制器中以覆盖respond_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 :(得分:1)

好的看看它是怎么回事。当您在respond_with操作中调用update时(如果对象有效),它将重定向到show操作(如果您不想要此默认行为,则必须提供{{1}转到location: "other_action")。