Ruby on rails Backbone.js和Rails-如何处理主干模型中的参数?
在标准Rails控制器中,我会创建如下记录:Ruby on rails Backbone.js和Rails-如何处理主干模型中的参数?,ruby-on-rails,backbone.js,Ruby On Rails,Backbone.js,在标准Rails控制器中,我会创建如下记录: @user = User.new(params[:user]) 这假定传入的表单参数是嵌套的 我一直在玩Backbone.js,我注意到默认情况下,Backbone不会像普通Rails那样嵌套参数,这实际上是我所期望的。所以我想知道我应该怎么做 是吗 在服务器端,通过查看accepts标头等来确定它是否是来自主干网的请求,并亲自操作参数,以便我可以保持控制器代码的小型化: do_some_params_manipulation_with(param
@user = User.new(params[:user])
这假定传入的表单参数是嵌套的
我一直在玩Backbone.js,我注意到默认情况下,Backbone不会像普通Rails那样嵌套参数,这实际上是我所期望的。所以我想知道我应该怎么做
是吗
在服务器端,通过查看accepts标头等来确定它是否是来自主干网的请求,并亲自操作参数,以便我可以保持控制器代码的小型化:
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表单和主干表单与根节点匹配,那就太好了。这就是为什么在我的上一个应用程序中,我选择覆盖主干模型的toJSON方法 您可以重写全局toJSON方法。但即使是非干法方法也不是那么糟糕。每个模型定义只有一行样板文件:
// 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中实现了它
从Rails 3.1开始,现在有一个新的初始值设定项,名为
wrap\u parameters.rb
,默认情况下处理这个问题。处理这种情况的代码是:
# Disable root element in JSON by default.
ActiveSupport.on_load(:active_record) do
self.include_root_in_json = false
end
八达冰 如果您使用的是
主干rails
gem,看起来您可以这样做
var User = Backbone.Model.extend({
paramRoot: 'user'
});
大约45号线
这要归功于PL J和stream 7。应该注意的是,如果您选择当前接受的答案(在模型级别修补到JSON),您也会影响阅读。也许这是不言而喻的,也许不是。但是,如果在主干应用程序中使用此修补程序,则在渲染模型/集合时,您将有大量工作要做。因此,我个人不会按原样使用它。我接受了这个答案,因为这几乎是为了钱,但我决定只在服务器端处理这个问题。如此明显,却又如此难以捉摸。非常感谢。
this.constructor.name.toLowerCase()
可以用作父模型对象App.Model
上的对象键,它扩展了Backbone.Model
。这打破了在模板中使用toJSON的能力。这不好。这会在返回项目列表时造成安全风险。应始终包括根节点以防止出现这种情况。绝对值得一读。链接中线程末尾的一些好点。在Rails环境中,有一些内置的检查来防止这种利用漏洞的情况。。。这并不是说删除根节点是正确的。太棒了!我不知道它包括了那个。