gpt4 book ai didi

ruby-on-rails - 使用 Backbone.js + Rails 更新模型不起作用(未找到 PUT 路径)

转载 作者:行者123 更新时间:2023-12-04 04:21:14 24 4
gpt4 key购买 nike

在backbone.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 的 url 包含 id“/categories/:id”,而不仅仅是“/categories”

我通过将模型网址更改为:
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 添加到 url 或者我错过了什么?

最佳答案

Backbone 将根据 Model.url() 的结果确定要使用的 url。所以如果你有

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

url 主干的保存方法将在服务器上尝试为:host+'/categories'

如果您没有定义 url 函数,则 url 函数的默认行为将委托(delegate)给它所在的集合。因此,如果您有一个集合
class Categories extends Backbone.Collection
model:Category
url: ->
host + '/categories'
class Category extends Backbone.Model
name: '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

备注 这不是黑客攻击。这是正确使用主干。事实上,在 future 版本的 Backbone 中,我相信 url 函数不会有默认行为,并且必须为所有模型编写 url 函数。

关于ruby-on-rails - 使用 Backbone.js + Rails 更新模型不起作用(未找到 PUT 路径),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6113136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com