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。
我已经对model.name属性下的命名空间保存请求进行了一些修改。 它只在sync()
期间调用猴子补丁toJSON()
,并恢复原始方法,以便照常使用它。
我已经在CoffeeScript中实现了它。
非常感谢这个。 – 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!
返回项目列表时,这构成安全风险。应始终包含根节点以防止出现这种情况。 http://haacked.com/archive/2009/06/24/json-hijacking.aspx – Altonymous 2012-10-08 17:24:05
绝对值得一读。链接中线程末尾的一些好点。在Rails环境中,有一些内置的检查来防止这种利用可能被使用的情况......这并不是说根本无需关闭根节点。 – 2012-10-08 19:58:20
流7应该注意的如果您选择当前接受的答案(在模型级别修补JSON),您也会影响阅读。也许这不言而喻,也许不是。但是,如果您在骨干应用程序中将此修补程序置于影响范围内,则在渲染模型/集合时,您将需要做很多工作。因此,我个人不会按原样使用它。
我已经接受了这个答案,因为它的钱很多,但我决定只是在服务器端处理这个问题。 – 2011-08-05 05:55:17
所以很明显,但如此难以捉摸。谢谢你。 – Cory 2012-04-15 00:36:56
'this.constructor.name.toLowerCase()'可以用作扩展'Backbone.Model'的父模型对象'App.Model'上的对象键。 – 2017-05-23 13:31:37