Backbone.js和Rails - 如何处理来自Backbone模型的参数?

Bri*_*gan 23 ruby-on-rails backbone.js

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

@user = User.new(params[:user])
Run Code Online (Sandbox Code Playgroud)

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

我一直在玩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
Run Code Online (Sandbox Code Playgroud)

或者,我是否在每个分支中实例化对象,最终会重复代码,但从长远来看可能更易于维护....

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

或者我是否通过重写.toJSON方法修改我的Backbone.js模型(我不完全确定如何做,因为我还不太了解Backbone.js)所以它嵌套了params?

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

eva*_*phy 36

如果你可以让一般的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
});
Run Code Online (Sandbox Code Playgroud)

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


小智 9

如果你正在使用backbone-rails宝石,看起来你可以做到

var User = Backbone.Model.extend({
   paramRoot: 'user'
});
Run Code Online (Sandbox Code Playgroud)

github附近的第45行

在此链接上获得PL J和第7流