Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Backbone.js和Rails-如何处理主干模型中的参数?_Ruby On Rails_Backbone.js - Fatal编程技术网

Ruby on rails Backbone.js和Rails-如何处理主干模型中的参数?

Ruby on rails Backbone.js和Rails-如何处理主干模型中的参数?,ruby-on-rails,backbone.js,Ruby On Rails,Backbone.js,在标准Rails控制器中,我会创建如下记录: @user = User.new(params[:user]) 这假定传入的表单参数是嵌套的 我一直在玩Backbone.js,我注意到默认情况下,Backbone不会像普通Rails那样嵌套参数,这实际上是我所期望的。所以我想知道我应该怎么做 是吗 在服务器端,通过查看accepts标头等来确定它是否是来自主干网的请求,并亲自操作参数,以便我可以保持控制器代码的小型化: do_some_params_manipulation_with(param

在标准Rails控制器中,我会创建如下记录:

@user = User.new(params[:user])
这假定传入的表单参数是嵌套的

我一直在玩Backbone.js,我注意到默认情况下,Backbone不会像普通Rails那样嵌套参数,这实际上是我所期望的。所以我想知道我应该怎么做

是吗

在服务器端,通过查看accepts标头等来确定它是否是来自主干网的请求,并亲自操作参数,以便我可以保持控制器代码的小型化:

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表单和主干表单与根节点匹配,那就太好了。这就是为什么在我的上一个应用程序中,我选择覆盖主干模型的toJSON方法

您可以重写全局toJSON方法。但即使是非干法方法也不是那么糟糕。每个模型定义只有一行样板文件:

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

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

在其中一个问题的答案中,提到了一个补丁,我认为它可以满足您的需要。

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

我已经在CoffeeScript中实现了它


从Rails 3.1开始,现在有一个新的初始值设定项,名为
wrap\u parameters.rb
,默认情况下处理这个问题。处理这种情况的代码是:

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

八达冰

如果您使用的是
主干rails
gem,看起来您可以这样做

var User = Backbone.Model.extend({
   paramRoot: 'user'
});
大约45号线


这要归功于PL J和stream 7。应该注意的是,如果您选择当前接受的答案(在模型级别修补到JSON),您也会影响阅读。也许这是不言而喻的,也许不是。但是,如果在主干应用程序中使用此修补程序,则在渲染模型/集合时,您将有大量工作要做。因此,我个人不会按原样使用它。

我接受了这个答案,因为这几乎是为了钱,但我决定只在服务器端处理这个问题。如此明显,却又如此难以捉摸。非常感谢。
this.constructor.name.toLowerCase()
可以用作父模型对象
App.Model
上的对象键,它扩展了
Backbone.Model
。这打破了在模板中使用toJSON的能力。这不好。这会在返回项目列表时造成安全风险。应始终包括根节点以防止出现这种情况。绝对值得一读。链接中线程末尾的一些好点。在Rails环境中,有一些内置的检查来防止这种利用漏洞的情况。。。这并不是说删除根节点是正确的。太棒了!我不知道它包括了那个。