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

时间:2011-06-07 21:55:54

标签: ruby-on-rails backbone.js

在标准的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?< / p>

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

6 个答案:

答案 0 :(得分:36)

当你可以让一般的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 :(得分:9)

如果您正在使用backbone-rails gem,看起来就可以

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

github

附近第45行

在此link

上记入PL J和流7

答案 2 :(得分:4)

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

我已经在CoffeeScript中实现了它。

Check it here

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

从Rails 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
巴达邦!