【问题标题】:Nested attributes in JavaScript fronted Rails applicationsJavaScript 前端 Rails 应用程序中的嵌套属性
【发布时间】:2011-12-07 06:27:57
【问题描述】:

我发现 JavaScript 单页应用程序提供的交互性使得在客户端构建复杂的嵌套对象变得非常容易。

例如,在我正在编写的应用程序中,我有一个 Backbone 目标和原始模型,一条连接它们的路线,然后是一条通过该路线的公共汽车。所有这些都在客户端很自然地结合在一起。

# Bus toJSON()
  { 
    seats: 45,
    route: {
      summary: "a route summary",
      origin: {
        latitude: 45.654634,
        longitude: 23.5355
      },
      destination: {
        latitude: 45.654634,
        longitude: 23.5355
      }
    }
  }

但是,我发现当需要持久化我的总线时(用户已准备好保存所有内容),rails 模型accepts_nested_attributes_for 方法使事情变得非常丑陋。我最终不得不将数据发送到看起来像

的服务器
{ "bus_route_attributes_origin_attributes_latitude" => "45.654634" } 

为了让 ActiveRecord 能正常播放。

我应该如何更改我的服务器端以允许我更轻松地处理 JSON?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 backbone.js javascript-framework


    【解决方案1】:

    好吧,当您已经使用 accepts_nested_attributes 设置模型时,例如,当您使用 accepts_nested_attributes更新你的模型,你可以简单地在你的控制器中做以下事情(我假设你已经做了这样的事情):

    def update
      bus = Bus.find(params[:id]
      if bus.update_attributes(params[:bus])
        flash[:success] = "Success"
      else
        flash[:error] = "Error"
      end
    
      redirect_to :back
    end
    

    有了这个,Active Record 只会更新模型中真正发生变化的部分,即使它嵌套在其他模型中。

    但是,这种方法需要来自客户端的完整 bus 对象。如果您只想更新一个属性,那么您将被困在目前的方法中。我同意这很丑陋,但是当您只是序列化您的完整总线对象并在每次发生变化时将其发送到服务器时,Rails 就会为您找出发生了什么变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 2011-02-25
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多