gpt4 book ai didi

ruby-on-rails - Rails respond_with 在索引和创建方法中的作用不同

转载 作者:行者123 更新时间:2023-12-03 14:34:57 25 4
gpt4 key购买 nike

我正在 Rails 3.1 中构建一个简单的 json API。我创建了一个具有两个功能的 Controller :

class Api::DogsController < ActionController::Base
respond_to :json, :xml
def index
respond_with({:msg => "success"})
end

def create
respond_with({:msg => "success"})
end
end

在routes.rb我有
namespace :api do 
resources :dogs
end

当我向 http://localhost:3000/api/dogs 发出 get 请求时我从上面得到了正确的 json。当我向同一个 url 发帖时,我收到一个 rails 异常:
ArgumentError in Api::DogsController#create
Nil location provided. Can't build URI.
actionpack (3.1.0) lib/action_dispatch/routing/polymorphic_routes.rb:183:in `build_named_route_call`
actionpack (3.1.0) lib/action_dispatch/routing/polymorphic_routes.rb:120:in `polymorphic_url'
actionpack (3.1.0) lib/action_dispatch/routing/url_for.rb:145:in `url_for'

但是如果我将创建代码更改为
def create
respond_with do |format|
format.json { render :json => {:msg => "success"}}
end
end

它返回 json 就好了。

有人可以解释这里发生了什么吗?

最佳答案

在自己遇到这个问题并克服它之后,我相信我可以提供一个答案。

当你简单地说:

def create
respond_with({:msg => "success"})
end

rails 尝试做的是“猜测”新创建的资源可用的 url,并将其放置在 HTTP location header 中。 .对于散列对象(它推导出的位置为零,这会导致您看到的错误消息),该猜测失败了。

为了解决这个问题,您需要执行以下操作:
def create
respond_with({:msg => "success"}, :location => SOME_LOCATION)
end

假设您知道新资源的位置。您甚至可以将“nil”指定为“SOME_LOCATION”,这会起作用(有点荒谬)。

关于ruby-on-rails - Rails respond_with 在索引和创建方法中的作用不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7303551/

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