2012-03-16 2 views
0

投稿用にapiメソッドを作成しました。私はroutes.rbで指定する必要があります:postだけですが、ブラウザからapiを呼び出すと、GETルートが見つからないと不平を言う。どうしましたか?ブラウザ上でrails routes.rb、なぜルーティングはポストリクエストだけであるときにgetを指定しなければならないのですか?

class Api::XyzsController < ApiController 

    # POST /api/create_xyz 
    def create_xyz 

    product = Product.find(params[:rpt_id]) 
    Xyz.create!(:product_id => product.id , 
       :status => 'open',....) 

    render :json => {:message => 'Submitted.'}, :status => :ok 
    end 
end 

routes.rbを

... 
namespace 'api' do 
     match 'create_xyz' => 'xyzs#create_xyz', :via => [:post] 
end 

ポスト、http://localhost/api/create_xyz?rpt_id=123 は取得エラー:

No route matches [GET] "/api/create_xyz 

ルートが生成さ:

api_report_xyz POST  /api/report_xyz(.:format) {:format=>"json", :action=>"report_xyz", :controller=>"api/xyzs"} 

私が手を追加した場合routes.rbのviaにそれを修正します。しかし、それがポストメソッド呼び出し時に取得することをなぜ主張するのか理解できません。

+0

どのように実際にこの投稿リクエストを送信しようとしていますか? – James

+0

私はここで大きな誤解が起こっていると思います。リンク(a href)またはredirect_toを使用すると、常にGETリクエストになります。それをポストにすることは何もできません。これはレールの制限ではありません。これは、ブラウザとHTTPの仕組みです。 – masukomi

答えて

0

:viaオプションは、GETの場合、POSTになるよう強制しません。これは、着信要求をPOST要求に限定するだけです。要求は依然としてPOSTとして構築する必要があります。

+0

?私はURLが間違っていると指定する方法ですか?私はどうしたらいいですか? [link] http:// localhost/api/create_xyz?rpt_id = 123 – jmsia

+0

クエリ文字列を追加した通常のリンクを作成するだけの場合は、GETリクエストが発行されます。 POST要求をするには、フォームの属性としてmethod = "post"を持つフォームを作成するか、または、もしあなたがrailsのlink_toメソッドを使用している場合は、method =>:postというオプションを使用して、 POSTリクエスト。 link_toで:method =>:postオプションを使用すると、実際には少しの魔法の魔法であり、リンクをフォームに変換することに注意してください。 – kclair

+0

ハァッ、それは面白いです。しかし、これはapiコントローラクラスです。コントローラ内のアクションです。これには実際にフォームの関連はありません。上記のように、アクション内では、パラメータを要求しています。それだけです。フォームは全くありません。コントローラーアクションでPOSTを実行する方法はありますか? – jmsia

0

設定:via =>:あなたのルートファイルのpostは、POSTルートしか存在しないことを意味します。

あなたのアプリケーションに送信しようとするものを制御するものではありません。しかし、あなたがPOSTルートしか持っていないために、あなたのアプリが「ルートなし」と言うGETリクエストを送信したかどうかはわかります。

私は関連するビューがなく、API用であることを理解していますが、これはテスト中ですが、GETリクエストを送信しています。受け取ったリクエストのタイプはリクエストの発信者によって決まります(外部から来ると仮定して)。あなたがテストしている方法や、発信者がPOSTであるように要求を送信する方法を変更して、問題はなくなります。

関連する問題