2012-02-22 9 views
13

私は、私が取得、作成、削除、更新する定期的な安らかなモデルを持っています。その上で、change_passwordのような、そのモデルで特別なアクションを呼びたいと思います。安らかなモデルで安らかな行動を使用しているbackbone.js

通常のRESTfulなルートは3つの路線の伝統的なRailsのとおりです。

fetch => GET /api/models/:id 
save => PUT /api/models/:id 
create => POST /api/models 
destroy => DELETE /api/models/:id 

しかし、それらの上に、私は特別な操作を持っている:

changePassword => GET /api/models/:id/change_password 
activate  => GET /api/models/:id/activate 

のように。

モデルでセットアップする必要があるため、これらの新しいアクションを認識し、コールをモデルメソッドにラップする方法を教えてください。

答えて

30

新しいメソッドをモデルに追加するのはかなり簡単です。.extend()に新しいメソッドを指定するだけです。あなたは、この一部を自分でコーディングする必要がありますが、Backbone.syncのような既存の機械($.ajax()周りのほとんどは単なるラッパー)とモデルの既存のurl性質を利用することができる。

var MyModel = Backbone.Model.extend({ 

    activate: function(opts) { 
     var model = this, 
      url = model.url() + '/activate', 
      // note that these are just $.ajax() options 
      options = { 
       url: url, 
       type: 'POST' // see my note below 
      }; 

     // add any additional options, e.g. a "success" callback or data 
     _.extend(options, opts); 

     return (this.sync || Backbone.sync).call(this, null, this, options); 
    }, 

    // etc 

}); 

だけコメントとして、RESTの観点からchangePasswordおよびactivate操作はでなく、でなければなりません。すべてのGETメソッドは冪等でなければなりません。これはRESTifarianismだけではなく、良いアイデアです。これらのURLをキャッシュする(何も起こりません)か、または何度も何度もそれらを打つことになります(通常はPOSTリクエストでユーザーの確認が必要です)。できるだけこれらのPOSTコールを行います。

+2

は、GETに関する発言をありがとうPOSTに対して、私はそれらを確実に変更します。 – kolrie

+0

'POST'パラメータが有効ではないようです。代わりに「CLICK」動詞が使用されているようです(Chrome)。 –

+0

あなたがここで何を意味するのかわかりません - HTTPでは 'CLICK'動詞はありません – nrabinowitz

8

を保存してパスワードを変更することができるパスワードモデル/コントローラを追加することをお勧めします。これは、RESTの規格に準拠していますし、それはオプションではありません場合は、次のようにCoffeeScriptの例であるBACKBONE.JS

の機能が内蔵されて、あなたのモデルにこれを追加します。

activate: -> 
    unless user.get('active') 
    (@sync || Backbone.sync).call @, 'activate', @, 
     url: "#{@url()}/users/#{message.get('id')}/activate" 
     data: {} 
     complete: => 
     user.set(active: true) 
     @set(active: true) 
+0

なぜ成功しないのですか? 'success:=> console.log 'success''(完了の代わりに)? – itsnikolay

関連する問題