为什么在这种情况下不响应_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)
答案 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"
)。