Ruby on rails Rails以不同的索引和创建方法响应_

Ruby on rails Rails以不同的索引和创建方法响应_,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 3.1,我正在Rails 3.1中构建一个简单的json API。我创建了一个具有两个功能的控制器: class Api::DogsController < ActionController::Base respond_to :json, :xml def index respond_with({:msg => "success"}) end def create respond_with({:msg => "success"}) end end

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

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

  def create
    respond_with({:msg => "success"})
  end
end
当我发出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,并将其放入。对于散列对象,这种猜测失败得很惨(它推断出的位置是nil,这导致您看到的错误消息)

要解决此问题,您需要执行以下操作:

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

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

我自己也有这个问题

正如Aubergine所说,它与http位置头相关

实际上,rails似乎在默认情况下使用
show route
构建此位置

如果你没有一个
show action
,这在API中很奇怪,但可能发生(我认为)`,那么你必须自己设置一个位置。我不知道这种情况的标准是什么

如果你碰巧需要一条表演路线,那么对它进行编码,一切都会正常进行

干杯。

我发现了 errors={:error=>@device.errors.full_messages} 用(错误,:状态=>:错误请求,:位置=>nil)响应\u 作品:位置是必需的,将其设置为nil有助于与等级库一起使用: expect(最后的响应状态)。而不是eql 201 期望(最后的响应。位置)。为零


我遇到的问题是,我没有返回错误哈希,只是返回状态。添加错误散列并自己设置位置解决了问题。

将位置设置为字符串文字“nil”有效:
使用({:error=>“bad”},:status=>401,:location=>“nil”)响应(
@kwbeam我在最后一段中谈到了实际的nil值(我现在意识到引号可能有点误导性)我确实认为你的意思是nil对象,而不是字符串文字,但当我尝试它时,它仍然失败。然而,我只是将它改回nil(对象,而不是字符串文字),它就可以工作了。很明显,我在某个地方失败了,但我无法重建我做错了什么。很抱歉给你带来了困惑。(在此期间,我更新了Rails和许多gems的版本,因此可能有一个bug被修复了……但我不确定)非常感谢。我也有同样的问题,这就解决了。如果我允许的话,我会投你两次票。谢谢+我也帮了我!非常感谢!注意:我刚刚将我的位置设置为“”,对我来说效果很好。
def create
  respond_with({:msg => "success"}, :location => SOME_LOCATION)
end