Subscribed unsubscribe Subscribe Subscribe

@kyanny's blog

Write down what I learnt. Opinions are my own.

Backbone.sync で毎回パラメータを付与する with Rails

いつもよくわからなくなって混乱するので調べてまとめた。実験に使ったアプリ https://github.com/kyanny/backbone_sync_rails_app

フロントエンドを Backbone.js、バックエンドを Rails として、 fetch/save/destroy いずれの場合も必ず token というパラメータを付与したい場合、それぞれ以下のようになる。

fetch (id なし)

fetch にパラメータをつけたい場合は data: {token: 'abc'} の形でオプションを渡す。

user = new User
user.fetch
  data:
    token: 'abc'
GET http://localhost:3000/users?token=abc

Started GET "/users?token=abc" for 127.0.0.1 at 2014-12-08 22:51:31 +0900
Processing by UsersController#index as JSON
Parameters: {"token"=>"abc"}
""
Completed 200 OK in 1ms (Views: 0.2ms | ActiveRecord: 0.0ms)
fetch (id あり)
user = new User id: 123
user.fetch
  data:
    token: 'abc'
GET http://localhost:3000/users/123?token=abc

Started GET "/users/123?token=abc" for 127.0.0.1 at 2014-12-08 22:51:32 +0900
Processing by UsersController#show as JSON
Parameters: {"token"=>"abc", "id"=>"123"}
""
Completed 200 OK in 2ms (Views: 0.4ms | ActiveRecord: 0.0ms)
save (id なし)

save の場合は model の attributes が JSON になった文字列がリクエストボディになるので save の第一引数で渡す(もしくは model.set してもいい)

user = new User
user.save
  token: 'abc'
POST http://localhost:3000/users

Started POST "/users" for 127.0.0.1 at 2014-12-08 22:51:33 +0900
Processing by UsersController#create as JSON
Parameters: {"token"=>"abc", "user"=>{"token"=>"abc"}}
"{\"token\":\"abc\"}"
Completed 201 Created in 2ms (Views: 0.5ms | ActiveRecord: 0.0ms)
save (id あり)
user = new User id: 123
user.save
  token: 'abc'
PUT http://localhost:3000/users/123

Started PUT "/users/123" for 127.0.0.1 at 2014-12-08 22:51:34 +0900
Processing by UsersController#update as JSON
Parameters: {"id"=>"123", "token"=>"abc", "user"=>{"id"=>"123", "token"=>"abc"}}
"{\"id\":123,\"token\":\"abc\"}"
Completed 200 OK in 1ms (Views: 0.1ms | ActiveRecord: 0.0ms)
destroy

destroy の場合は model の attributes は送られないので data: {token: 'abc'} の形でオプション渡しする必要がある。なおかつ processData: true をつけないと [object object] みたいな文字列がサーバーに送られてしまう。

user = new User id: 123
user.destroy
  data:
    token: 'abc'
  processData: true
DELETE http://localhost:3000/users/123

Started DELETE "/users/123" for 127.0.0.1 at 2014-12-08 22:51:34 +0900
Processing by UsersController#destroy as JSON
Parameters: {"token"=>"abc", "id"=>"123"}
"token=abc"
Completed 204 No Content in 1ms (Views: 0.2ms | ActiveRecord: 0.0ms)