Backbone.js和Rails - 如何处理Backbone模型中的params?

问题描述:

在一个标准的Rails控制器,我想创建一个记录是这样的:Backbone.js和Rails - 如何处理Backbone模型中的params?

@user = User.new(params[:user]) 

这假定该进来的形式参数嵌套。

我一直在玩Backbone.js,我注意到,默认情况下,Backbone不会像普通的Rails窗体那样嵌套参数,这实际上是我期望的。所以我不知道我应该怎么办...

难道我

弄清楚在服务器端,如果它是从骨干网的请求通过看接受头,等和操纵PARAMS自己,所以我可以让我的控制器代码小:

do_some_params_manipulation_with(params) 
@user = User.new(params[:user]) 
respond_to do |format| 
    if @user.save 
    format.html {redirect_to users_url} 
    format.json {render :json => @user.to_json } 
    end 
end 

或者,我实例化与重复的代码结束了,但可能是从长远来看,更易于维护的每一个分支的对象....

respond_to do |format| 
    format.html do 
    @user = User.new(params[:user]) 
    if @user.save 
     redirect_to users_url 
    end 
    end 

    format.json do 
    @user = User.new(params) # and rely on mass-assignment protection 
    if @user.save 
     render :json => @user.to_json 
    end 
    end 

end 

或者我是否通过重写.toJSON方法来修改我的Backbone.js模型(我不完全知道该怎么做,因为我对Backbone.js还不够了解),以便嵌套这些参数?

在这种情况下,我可以访问应用程序的两面,但我对其他人在做什么感兴趣。

当您可以使通用Rails窗体和Backbone窗体相对于根节点匹配时,这很好。这就是为什么在我上一次的应用程序中,我选择重写Backbone模型的toJSON方法。

您可以覆盖全局toJSON方法as Raimonds Simanovskis suggested。但即使是非DRY方式也不是那么糟糕。样板只有一条线路为每个模型定义:

// Depends on Underscore.js 
User = Backbone.Model.extend({ 
    toJSON: function() { 
    return { user: _.clone(this.attributes) } 
    }, 
    // Your other methods here 
}); 

编辑:更正代码示例。对不起,我从CoffeeScript翻译成JavaScript。

+1

我已经接受了这个答案,因为它的钱很多,但我决定只是在服务器端处理这个问题。 – 2011-08-05 05:55:17

+0

所以很明显,但如此难以捉摸。谢谢你。 – Cory 2012-04-15 00:36:56

+0

'this.constructor.name.toLowerCase()'可以用作扩展'Backbone.Model'的父模型对象'App.Model'上的对象键。 – 2017-05-23 13:31:37

Rails mass assignment and Backbone.js的答案之一中提到了补丁https://gist.github.com/719080,我认为它会做你所需要的。

我已经对model.name属性下的命名空间保存请求进行了一些修改。 它只在sync()期间调用猴子补丁toJSON(),并恢复原始方法,以便照常使用它。

我已经在CoffeeScript中实现了它。

Check it here

+0

非常感谢这个。 – 2013-07-31 05:00:44

铁轨3.1有现一个名为wrap_parameters.rb新初始化其默认地处理这个问题。处理这种情况的代码是:

# Disable root element in JSON by default. 
ActiveSupport.on_load(:active_record) do 
    self.include_root_in_json = false 
end 

Bada bing!

+0

返回项目列表时,这构成安全风险。应始终包含根节点以防止出现这种情况。 http://haacked.com/archive/2009/06/24/json-hijacking.aspx – Altonymous 2012-10-08 17:24:05

+0

绝对值得一读。链接中线程末尾的一些好点。在Rails环境中,有一些内置的检查来防止这种利用可能被使用的情况......这并不是说根本无需关闭根节点。 – 2012-10-08 19:58:20

如果您使用的是backbone-rails宝石,看起来像你可以在github

信用PL j执行

var User = Backbone.Model.extend({ 
    paramRoot: 'user' 
}); 

围绕线45,并在此link

+0

真棒!从来不知道它包含了那个。 – Duke 2012-11-22 00:21:03

+4

不适用于最新的主干 – kravc 2013-01-28 18:22:15

流7应该注意的如果您选择当前接受的答案(在模型级别修补JSON),您也会影响阅读。也许这不言而喻,也许不是。但是,如果您在骨干应用程序中将此修补程序置于影响范围内,则在渲染模型/集合时,您将需要做很多工作。因此,我个人不会按原样使用它。