在标准 Rails 控制器中,我将创建如下记录:
@user = User.new(params[:user])
这假设传入的表单参数是嵌套的。
我一直在使用 Backbone.js,我注意到默认情况下,Backbone 不会像普通 Rails 表单那样嵌套参数,这实际上是我所期望的。所以我想知道我应该做什么...
Do I
通过查看接受标头等来确定服务器端是否是来自 Backbone 的请求,并自己操作参数,以便我可以保持控制器代码较小:
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 表单和 Backbone 表单相对于根节点进行匹配,那就太好了。这就是为什么在我的上一个应用程序中我选择覆盖 Backbone 模型的 toJSON 方法。
您可以覆盖全局 toJSON 方法正如雷蒙兹·西马诺夫斯基斯建议的那样 http://twitter.com/#!/rsim/status/78220812519350274。但即使是非 DRY 方式方法也不是那么糟糕。每个模型定义只需一行样板:
// Depends on Underscore.js
User = Backbone.Model.extend({
toJSON: function() {
return { user: _.clone( this.attributes ) }
},
// Your other methods here
});
Edit:更正了代码示例。抱歉出现错误,我正在从 CoffeeScript 翻译为 JavaScript。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)