首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails respond_with在索引和创建方法上的作用不同

Rails respond_with在索引和创建方法上的作用不同
EN

Stack Overflow用户
提问于 2011-09-05 11:02:38
回答 3查看 7.6K关注 0票数 16

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

代码语言:javascript
复制
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中,我有

代码语言:javascript
复制
namespace :api do 
  resources :dogs
end

当我向http://localhost:3000/api/dogs发出get请求时,我从上面获得了正确的json。当我在同一个url上发布帖子时,我得到了一个rails异常:

代码语言:javascript
复制
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'

但是如果我将create code改为

代码语言:javascript
复制
def create
  respond_with do |format|
    format.json { render :json => {:msg => "success"}}
  end
end

它会很好地返回json。

有人能解释一下这是怎么回事吗?

EN

回答 3

Stack Overflow用户

发布于 2011-11-15 20:25:25

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

当你简单地说:

代码语言:javascript
复制
def create
  respond_with({:msg => "success"})
end

rails尝试做的是“猜测”新创建的资源所在的url,并将其放入HTTP location header中。对于hash对象,这种猜测失败得很糟糕(它推导出的位置是nil,这会导致您看到的错误消息)。

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

代码语言:javascript
复制
def create
  respond_with({:msg => "success"}, :location => SOME_LOCATION)
end

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

票数 38
EN

Stack Overflow用户

发布于 2012-06-10 06:51:12

我自己也有这个问题。

正如Aubergine所说,它与http位置报头有关。

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

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

如果碰巧您需要一个show route,那么编写它,一切都应该正常工作。

干杯。

票数 1
EN

Stack Overflow用户

发布于 2013-03-23 00:29:01

我发现errors = {:error => @device.errors.full_messages} respond_with( errors,:status => :bad_request,:location => nil)工作正常。:location是必需的,在使用spec: expect(last_response.status).not_to eql 201Expect(last_response.location).to be_nil时,将其设置为nil会有所帮助

我遇到的问题是,我返回的不是错误散列,而是状态。添加错误散列并自己设置位置解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7303551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档