在标准的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>
在这种情况下,我可以访问应用程序的两面,但我对其他人正在做的事感兴趣。
答案 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'
});
附近第45行
在此link
上记入PL J和流7答案 2 :(得分:4)
我在model.name属性下对命名空间保存请求进行了一些修改。
它仅在toJSON()
调用期间修补sync()
个修补程序并恢复原始方法,以便您可以照常使用它。
我已经在CoffeeScript中实现了它。
答案 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
巴达邦!