带有远程Rails服务器的BackBone客户端

Rev*_*evH 2 json client-server ruby-on-rails backbone.js cordova

背景:

我使用"rails g scaffold hotel name stars:integer"来快速启动(并在数据库中插入一些记录),并在rails app之外编写一个Backbone客户端.

我使用Safari文件在本地打开Backbone客户端:///Users/lg/Workspace/www/index.html用于测试客户端,因为我的想法是将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'
});
Run Code Online (Sandbox Code Playgroud)

但是,当我与骨干取酒店,导轨与响应format.html而不是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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

编辑: 更新了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)
Run Code Online (Sandbox Code Playgroud)

相反,如果我只设置/酒店它工作(但骨干客户端必须驻留在服务器上)

编辑2:

在github上传了代码

https://github.com/RevH/backbonefails

编辑3:

另一个细节是,如果您将backboneclient目录插入Rails公共目录并将0.0.0.0:3000/hotels.json更改为/ hotels它的工作非常棒!! 但是,如果我将客户端与服务器分开并用Safari打开它,则需要在URL的末尾使用.json.这很奇怪.

我在https://github.com/rails/rails/issues/5005上打开github上的rails问题

jos*_*yer 10

需要了解的重要一点是,Rails中的最佳实践不是使用Accept标头.有一个很好的书面记录在这里解释了为什么在光彩细致.摘要是HTTP Accept标头的浏览器实现已损坏.Rails的最佳实践是在请求中设置:format参数.但是,如果您喜欢它们受支持的接受标题,但有关rails中有效接受标头的规则可能会非常棘手.如果您的接受标头与以下正则表达式匹配:

BROWSER_LIKE_ACCEPTS = /,\s*\*\/\*|\*\/\*\s*,/
Run Code Online (Sandbox Code Playgroud)

然后rails将其抛弃并默认为text/html mime类型.我知道,对吧?您的标题恰好与此匹配.大多数人没有这个问题的原因是rails"修复"了rails jquery-ujs中的默认jquery行为.他们在JQuery中设置一个ajaxSetup之前的回调,把它放在*/*标题的开头,这就是魔术乐队正则表达式想要看到的,虽然我不知道为什么,除了他们知道一个未经修改的浏览器请求总会把它放在那里.以下是如何在JQuery中修复接受标头的方法.

$(function() {
  $.ajaxSetup({
    'beforeSend': function(xhr) {
    xhr.setRequestHeader("accept", "application/json");
    }
  });
});
Run Code Online (Sandbox Code Playgroud)