Backbone.js和Rails – 如何处理Backbone模型中的参数?

在标准的Rails控制器中,我创建一个这样的记录:

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

这假设嵌套的表单参数是嵌套的。

我一直在玩Backbone.js,我注意到默认情况下,Backbone没有像普通的Rails格式那样嵌套参数,这实际上是我所期待的。 所以我想知道我应该做些什么……

在服务器端弄清楚,如果它是来自Backbone的请求,通过查看接受标题等,并自己操纵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)所以它嵌套了params?

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

如果你可以让一般的Rails表单和Backbone表单相对于根节点匹配,这很好。 这就是我在上一个应用程序中选择覆盖Backbone模型的toJSON方法的原因。

你可以覆盖Raimonds Simanovskis建议的全局toJSON方法。 但即使是非DRY方式也不是那么糟糕。 每个模型定义只需一行样板:

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

编辑:更正的代码示例。 很抱歉错误,我正在从CoffeeScript转换为JavaScript。

如果您正在使用backbone-rails gem,看起来就像您可以做到的那样

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

在github附近的第45行

在此链接上信用PL J和流7

我在model.name属性下对命名空间保存请求进行了一些修改。 它仅在sync()调用期间修补了toJSON()并恢复原始方法,因此您可以像往常一样使用它。

我在CoffeeScript中实现了它。

在这里查看

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

在Rails批量分配和Backbone.js的答案之一中,提到了补丁https://gist.github.com/719080 ,我认为它可以满足您的需求。

从Rails 3.1开始,现在有一个名为wrap_parameters.rb的新初始化wrap_parameters.rb ,它默认处理这个问题。 处理这种情况的代码是:

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

巴达冰!