Вложенные атрибуты в приложениях Rails с интерфейсом JavaScript

Я считаю, что интерактивность, которую обеспечивает одностраничное приложение 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 models accepts_nested_attributes_for делает вещи довольно уродливыми. В итоге мне приходится отправлять данные на сервер, который выглядит как

{ "bus_route_attributes_origin_attributes_latitude" => "45.654634" } 

чтобы заставить ActiveRecord хорошо играть.

Как мне изменить свою серверную часть, чтобы упростить работу с JSON?


person David Tuite    schedule 07.12.2011    source источник


Ответы (1)


Ну, когда вы уже настроили свои модели с помощью 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 выясняет, что изменилось за вас.

person Christoph Eicke    schedule 07.12.2011