Вложенные атрибуты в JavaScript-приложениях Rails - PullRequest
0 голосов
/ 07 декабря 2011

Я считаю, что интерактивность, которую обеспечивает одностраничное приложение JavaScript, позволяет легко создавать сложные вложенные объекты на стороне клиента.

Например, в приложении, которое я пишу, у меня есть базовые и конечные модели назначения, маршрут, который соединяет их, а затем автобус, который следует по этому маршруту. Все это вполне естественно на стороне клиента.

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

Тем не менее, я обнаружил, что, когда приходит время сохранить мой автобус (пользователь готов сохранить все), метод рельсовых моделей accepts_nested_attributes_for делает вещи довольно ужасными. В итоге мне нужно отправить данные на сервер, который выглядит как

{ "bus_route_attributes_origin_attributes_latitude" => "45.654634" } 

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

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

1 Ответ

1 голос
/ 07 декабря 2011

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

...