2011-09-05 10 views
16

私はRails 3.1で簡単なjson APIを構築しています。私はRails respond_withは異なるインデックスと作成メソッドを扱います

namespace :api do 
    resources :dogs 
end 

私はhttp://localhost:3000/api/dogsにGET要求を行うとき、私は上から正しいJSONを取得していroutes.rbをで

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

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

:私は、2つの機能を持つコントローラを作成しました。

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を返す:私は同じURLにポストを作るとき、私はレールの例外を取得します。

誰かがここで何が起こっているのか説明できますか?

答えて

38

この問題を克服して克服した後、私は答えを提供できると信じています。

あなたは、単に言う:

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

何をしようとするレールは、新しく作成されたリソースがで利用可能であることのURLを「推測」、およびHTTP location headerに配置されます。その推測はハッシュオブジェクトのために悲惨に失敗します(それが推測する場所はゼロです、あなたが見ているエラーメッセージにつながります)。この問題を克服するために

、その後、次の手順を実行する必要があります:

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

新しいリソースが配置されている場所あなたが知っていると仮定すると。あなたは "SOME_LOCATION"として "nil"を指定することさえできますが、それはやや不条理に機能します。

+1

場所を文字列リテラル "nil"に設定すると、「respond_with({:error => "bad"}、:status => 401、:location => "nil") ' –

+0

@kwbeam最後の段落の実際のゼロ値(私は今引用符が誤解を招くかもしれないと分かっています) – Aubergine

+0

文字列リテラルではなく、オブジェクトがゼロであると思っていましたが、試しても失敗しました。しかし、私はそれをnil(文字列リテラルではなくオブジェクト)に戻しただけで、動作しています。だから明らかに私はどこかで失敗しましたが、私が間違ったことを再構築することはできません。混乱させて申し訳ありません。 (私は暫定的にRailsのバージョンと多くの宝石を更新していたので、おそらく修正されたバグがあったかもしれません...しかし、わかりません) –

1

私は自分自身に問題がありました。

Aubergineの言うとおり、httpの場所ヘッダーに関連するものです。

実際には、レールはデフォルトでshow routeを使用してこの場所を構築しているようです。

show actionがありません。APIには不思議ですが、起こる可能性がありますが、あなたは自分で位置を設定する必要があります。私はこの場合の標準が何であるか分かりません。

あなたがショールートを必要とする場合は、それをコーディングし、すべてがうまくいくはずです。

乾杯。

0

I者らは 誤差= {:エラー=> @ device.errors.full_messages} respond_with(エラー:ステータス=>:bad_request、:場所=> NIL) 作品。 :場所が必要とスペックで使用するときゼロにそれを設定するのに役立つている: (last_response.status)を期待する.not_to EQL 201 (last_response.location)を期待する私が持っていた問題は、私があったことである

be_nil .TOエラーハッシュを返さず、ステータスだけを返します。エラーハッシュを追加し、自分で位置を設定することで解決しました。

関連する問題