如何解决使用Backbone.js更新模型+ Rails不起作用找不到PUT路由
| 在ribs.js中,我正在更新类别模型:@category.save {
name : category_name,}
这样可以节省资源并在主干中正确更新集合。但是在Rails服务器端,由于路由错误而无法保存:
Started PUT \"/categories\" for 127.0.0.1 at 2011-05-24 11:18:16 -0400
ActionController::RoutingError (No route matches \"/categories\"):
问题在于,Rails希望PUT / update具有一个包含ID \“ / categories /:id \”的URL,而不仅仅是\“ / categories \”。
我通过更改以下模型的URL对此进行了测试:
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
我是否需要破解主干才能在URL中添加:id还是缺少某些内容?
解决方法
骨干网将从Model.url()的结果中确定要使用的网址。所以如果你有
class Category extends Backbone.Model
name: \'category\'
url: ->
host + \'/categories\'
将在服务器上尝试的url主干的save方法为:host + \'/ categories \'
如果未定义url函数,则url函数的默认行为将委派给它所在的集合。因此,如果有一个集合
class Categories extends Backbone.Collection
model:Category
url: ->
host + \'/categories\'
class Category extends Backbone.Model
name: \'category\'
并且属于Categories集合的Category实例将自动使用url host + \'/ categories \'+ \'/ \'+ category.id保存到服务器。
现在,如果您的模型不属于集合,那么您将无法执行此操作。您必须在模型中覆盖url函数,所以像这样
class Category extends Backbone.Model
name: \'category\'
url: ->
u = \"#{host}/categories/\"
u = \"#{u}#{this.id}\" if this.id
u
请注意,这不是黑客行为。这是正确使用骨干网。实际上,在骨干网的未来版本中,我相信url函数将没有默认行为,并且必须为所有Model编写url函数。
,在集合之外使用模型时,请提供url根目录:
class Category extends Backbone.Model
urlRoot: \'/categories\'
http://backbonejs.org/#Model-urlRoot
,如果您的类别出现在服务器端,则类别对象应具有一个ID,并且一切正常。根据您发送的代码,未设置ID:
@category.save {
name : category_name
}
在实例化类别时添加ID,应该可以,否则主干将尝试使用POST在后端创建类别。如果指定ID,它将进行PUT。那就是如果您为对象设置一个集合。
http://documentcloud.github.com/backbone/#Sync
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。