2011-05-24 38 views
8

在Backbone.js的,我更新的分類模型(未找到PUT路線):更新模型W/Backbone.js的+ Rails的工作不

@category.save { 
    name : category_name, 
} 

這節省了罰款和骨幹正確更新集合。但是在鐵軌上服務器端它不是因爲路由錯誤的節約:

Started PUT "/categories" for 127.0.0.1 at 2011-05-24 11:18:16 -0400 

ActionController::RoutingError (No route matches "/categories"): 

的問題是,軌預計PUT /更新有一個網址,包括id爲「/類別/:ID」,不只是「/類別「

我測試了這一點通過改變模型網址:

class Category extends Backbone.Model 
    name: 'category' 
    url: -> 
    host + '/categories' 

class Category extends Backbone.Model 
    name: 'category' 
    url: -> 
    host + '/categories/2' 

這工作正常。

Started PUT "/categories/2" for 127.0.0.1 at 2011-05-24 11:44:08 -0400 
    Processing by CategoriesController#update as JSON 
    Parameters: {"category"=>{"created_at"=>2010-03-14 16:30:07 -0400, "id"=>2, "name"=>"Lunchr5", "updated_at"=>2010-03-14 16:30:07 -0400, "user_id"=>1}, "api_key"=>"s1boakDIav30V6DzOFsY", "id"=>"2"} 
    User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`single_access_token` = 's1boakDIav30V6DzOFsY' LIMIT 1 
    User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 
    SQL (0.1ms) BEGIN 
    AREL (0.3ms) UPDATE `users` SET `visit_count` = 11, `perishable_token` = 'YG3s4yB01FxUMdMcK8m', `updated_at` = '2011-05-24 15:44:08' WHERE `users`.`id` = 1 
    SQL (0.3ms) COMMIT 
    Option Load (0.3ms) SELECT `options`.* FROM `options` WHERE (`options`.user_id = 1) LIMIT 1 
    Category Load (0.2ms) SELECT `categories`.* FROM `categories` WHERE `categories`.`id` = 2 LIMIT 1 
    SQL (0.1ms) BEGIN 
    Category Load (13.1ms) SELECT `categories`.`id` FROM `categories` WHERE `categories`.`user_id` = 1 AND (`categories`.`name` = BINARY 'Lunchr5') AND (`categories`.id <> 2) LIMIT 1 
    AREL (0.3ms) UPDATE `categories` SET `name` = 'Lunchr5', `updated_at` = '2011-05-24 15:44:09' WHERE `categories`.`id` = 2 
    SQL (0.3ms) COMMIT 
Redirected to http://localhost:3000/categories 
Completed 302 Found in 179ms 

是否必須破解骨幹網才能將該id添加到網址或我缺少什麼?

回答

17

骨幹將確定的URL從Model.url的結果使用()。所以,如果你有

class Category extends Backbone.Model 
    name: 'category' 
    url: -> 
     host + '/categories' 

的URL骨幹的保存方法將嘗試在服務器上的將是:主機+「/類別」

如果不定義URL的功能,對於URL功能的默認行爲委託給它的集合。所以,如果你有一個集合

class Categories extends Backbone.Collection 
    model:Category 
    url: -> 
     host + '/categories' 
class Category extends Backbone.Model 
    name: 'category' 

和類別的實例屬於分類收集將自動獲得使用URL主機+「/類別」 +「/」 +類別。 ID保存到服務器。

現在如果你的模型不是集合的一部分,那麼你不能這樣做。你必須覆蓋模型中的URL功能,所以像這樣

class Category extends Backbone.Model 
    name: 'category' 
    url: -> 
     u = "#{host}/categories/" 
     u = "#{u}#{this.id}" if this.id 
     u 

注意,這不是黑客攻擊。這是正確使用骨幹。事實上,在未來的骨幹版本中,我相信URL函數不會有默認行爲,並且必須爲所有模型編寫url函數。

+0

迄今爲止我讀過的最好的解釋! +1 – ezmilhouse 2012-04-03 19:31:10

+1

+1爲一個偉大的答案。這些東西應該在文檔或維基的「最佳實踐」部分中明確說明。 – sa125 2012-09-22 15:59:07

+1

我真的很驚訝。爲了確認,如果你想實現一個PUT請求,你將不得不寫這個'u ='鏈。這似乎有點不成熟。 – Trip 2013-12-05 13:26:05

0

如果您的類別存在於服務器端,那麼您的類別對象應該有一個ID並且一切正常。從您發送的代碼中,ID沒有設置:

@category.save { 
    name : category_name 
} 

實例化類的時候加的ID,它應該是好的,否則骨幹將嘗試創建一個POST後端的類別。如果您指定了ID,它將執行PUT。那就是如果你爲你的對象設置一個集合。

http://documentcloud.github.com/backbone/#Sync

+0

我沒有真正嘗試,包括在PARAMS {ID的ID:@ category.get( '身份證' )},但這沒有幫助。 – dMix 2011-05-24 16:05:46

+0

你的類別是否有ID?把它放在保存參數中將無濟於事。它只需要在模型上設置。 – Julien 2011-05-24 16:10:07

+0

該類別有一個ID。 – dMix 2011-05-24 16:17:44