gpt4 book ai didi

ruby-on-rails-3 - 为什么 respond_with 没有从我的模型返回 json?

转载 作者:行者123 更新时间:2023-12-03 00:48:13 26 4
gpt4 key购买 nike

为什么在这种情况下respond_with不响应json?我使用显式 .json (/tasks/4e3c1163a19d461203000106/items/4e4c27dfa19d46e0e400000a.json) 调用该操作

在我的 Controller 中 --

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]

在后一种情况下它工作得很好,但我想弄清楚为什么第一个情况不起作用。我的应用程序中的其他 Controller 和模型也会发生这种情况。不确定它是否是一个 mongoid 的东西? (rails 3.0.9/mongoid 2.1.8)

最佳答案

这是我写的一个猴子补丁,无论协议(protocol)如何,它总是响应你告诉它做的事情。 请注意,这确实破坏了 RESTful 最佳实践,如果您以 RESTful 方式响应,那么它可能会崩溃。但是,如果您的 JSON/XML 响应与主应用程序分开,那么它很有用,并且您的其他 Controller 也会这样做不打破。

用法,将其包含在任何 Controller 中以覆盖 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

关于ruby-on-rails-3 - 为什么 respond_with 没有从我的模型返回 json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7112473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com