【发布时间】:2012-02-11 14:42:49
【问题描述】:
背景:
我使用“rails g scaffold hotel name stars:integer”快速启动(并在数据库中插入一些记录), 并在 rails 应用程序之外编写一个 Backbone 客户端。
我使用 Safari file:///Users/lg/Workspace/www/index.html 在本地打开 Backbone 客户端以测试客户端,因为我的想法是将 Rails 服务器放在主机上(例如 Heroku)并插入将 Backbone 客户端转换为 PhoneGap 应用程序。
我的主干客户端只有几行:
Hotel = Backbone.Model.extend({
initialize: function(){
console.log("initialize Hotel")
}
});
Hotels = Backbone.Collection.extend({
model: Hotel,
url: 'http://0.0.0.0:3000/hotels'
});
但是当我获取带有骨干网的酒店时,rails 会以 format.html 而不是 Backbone 可以解析的 format.json 响应。
hotels_controller.rb
# GET /hotels
# GET /hotels.json
def index
@hotels = Hotel.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @hotels }
end
end
Safari 检查器控制台:
hotels = new Hotels()
Object
hotels.fetch()
Object
hotels.length
0
Request URL:http://0.0.0.0:3000/hotels
Request method:GET
Status code:200 OK
Request Headers
Accept:application/json, text/javascript, */*; q=0.01
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10
Response Headers
Cache-Control:max-age=0, private, must-revalidate
Connection:Keep-Alive
Content-Length:2233
Content-Type:text/html; charset=utf-8
Date:Sat, 11 Feb 2012 14:31:52 GMT
Etag:"606da2b7c21ca96c9d71aabccdd439e9"
Server:WEBrick/1.3.1 (Ruby/1.9.2/2011-07-09)
编辑: 将 url 更新为 url:“http://0.0.0.0:3000/hotels.json
它可以增加但不能使其他人 CRUD(例如 PUT)
hotels = new Hotels()
Object
hotels.fetch()
Object
hotels.length
5
hotel = hotels.get(2)
Object
hotel.set({name: "name 2"})
Object
hotel.save()
Object
PUT http://0.0.0.0:3000/hotels.json/2 404 (Not Found)
如果我只设置 /hotels 它可以工作(但骨干客户端必须驻留在服务器上)
编辑 2:
将代码上传到github
https://github.com/RevH/backbonefails
编辑 3:
另一个细节是,如果您将主干客户端目录插入 Rails 公共目录并将 0.0.0.0:3000/hotels.json 更改为 /hotels,效果会非常好!但是,如果我将客户端与服务器分开并使用 Safari 打开它,它需要 .json 在 url 的末尾。这很奇怪。
我在https://github.com/rails/rails/issues/5005 github 上打开了一个rails 问题
【问题讨论】:
-
你为什么不直接向它询问json? /hotels.json
-
因为如果我只插入 /hotels,Backbone 可以使用 REST 调用所有 CRUD 方法(这有效,但不能使用远程 url)
-
我不关注。当然它无论如何都可以调用所有的 CRUD 方法,因为它们依赖于给定的参数和 HTTP 方法,而不是格式。
-
我更新了我的原始帖子,并在 url 处附加了 .json 格式的示例
-
格式放在 URL 的末尾,而不是中间。
标签: ruby-on-rails json cordova backbone.js client-server