2

下位互換性のためにわずかな調整を加えるだけで、このようにバージョン管理されたAPIをセットアップしました。私のルートでは:

scope '(api(/:version))', :module => :api, :version => /v\d+?/ do
    …
    scope '(categories/:category_id)', :category_id => /\d+/ do
        …
        resources :sounds
        …
    end
end

次のURLを同じ場所に到達させるという成功した目標はすでに達成されています

/api/v1/categories/1/sounds/2
/api/categories/1/sounds/2
/categories/1/sounds/2
/sounds/2

私のディレクトリ構造は次のようなものです。

ここに画像の説明を入力してください

私が見ている問題は、私の見解ではリンク世代にあります。たとえば、サウンドショーページでサウンドbutton_toを削除する必要があります

<%= button_to 'Delete', @sound, :confirm => 'Are you sure?', :method => :delete %>

これにより、次のURLが次の形式で生成されますaction

"/api/sounds/1371?version=1371"

さらに、このdeleteメソッドは機能していません。代わりに、POST

の興味深い部分は次のrake routesとおりです。

                     sounds GET    (/api(/:version))(/categories/:category_id)/sounds(.:format)                               {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"index", :category_id=>/\d+/}
                            POST   (/api(/:version))(/categories/:category_id)/sounds(.:format)                               {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"create", :category_id=>/\d+/}
                  new_sound GET    (/api(/:version))(/categories/:category_id)/sounds/new(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"new", :category_id=>/\d+/}
                 edit_sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id/edit(.:format)                      {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"edit", :category_id=>/\d+/}
                      sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"show", :category_id=>/\d+/}
                            PUT    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"update", :category_id=>/\d+/}
                            DELETE (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"destroy", :category_id=>/\d+/}

サーバーログには次のように表示されます。

Started POST "/api/sounds/1371?version=1371" for 127.0.0.1 at Fri May 06 23:28:27 -0400 2011
  Processing by Api::SoundsController#show as HTML
  Parameters: {"authenticity_token"=>"W+QlCKjONG5i/buIgLqsrm3IHi5gdQVzFGYGREpmWYs=", "id"=>"1371", "version"=>371}

UJSとしてJQueryを使用しており、JQuery用のrails.jsの最新バージョンがあります。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> <!-- must be >= 1.4.4 for the rails 3 link js to work—&gt; 
<script src="/javascripts/jquery-ujs/src/rails.js?1304736923" type="text/javascript"></script>




私はこれが正しいことを知っていますtl;drが、私の質問は次のとおりです。「URLヘルパーがセットアップの正しいパスを生成するように、button_to link_toおよびその他のビュータグに何を入れる必要がありますか?」私は考えられるほぼすべての組み合わせを試しましたが、それらを適切な場所に配置することはできません。

4

1 に答える 1

2

解決策は簡単だったことがわかりました。ここで2つの間違いがあり、間違ったルートが生成され、URLがパラメータを追加しました。

  1. ルートの上にresources :sounds、私は誤ってこの線を持っていました:

    match '/sounds/:id(/:format)' => 'sounds#show'
    

    sounds/123/xmlページをキャッシュできるように、この行があります。これにより、へのすべてのルーティングが発生しましshowた。間違いは:format、括弧内にあることであり、一致する必要があることに気付きましたget。今それは読みます:

    get '/sounds/:id/:format' => 'sounds#show'
    
  2. 次に、button_toリンクで、@soundオブジェクトを2番目のパラメーターとして配置していました。Railsは、これから正しいURLをインテリジェントに推定しようとしましたが、オプションのapiパラメーターで失敗していました:version。に変更する

    sound_path(:id => @sound.id)
    

    魅力のように働いた。

于 2011-05-07T14:26:57.603 に答える