sedovalx / taxi

6 stars 3 forks source link

Создание новой аренды из кассовой формы #88

Closed sedovalx closed 9 years ago

sedovalx commented 9 years ago

В кассовой форме нужна кнопка создания новой аренды для выбранной машины. Машина при этом должна быть свободной, иначе кнопка неактивна. При нажатии на кнопку должен открываться мастер аренды. Путь $/cashier-list/cars/12/rents/new. При этом не нужно заводить отдельные шаблоны и контроллеры для этого. Можно использовать уже существующие, указав их в маршруте - смотри документацию .

kirzas commented 9 years ago

@sedovalx при использовании такого маршрута cashier-list.cars.car.rents появляется ошибка на строчке: let carId = transition.params.cashier-list.cars.car.car_id; вот такая: routes/cashier-list/cars/car/rents/new.js: line 13, col 43, 'list' is not defined.

я так понимаю, что проблема именно в имени через "-".

весь файл, в котором ошибка:

import ProtectedRoute from "client/routes/base/protected";
import DirtyRouteMixin from "client/routes/base/dirty-route-mixin";

export default ProtectedRoute.extend(DirtyRouteMixin, {
  setupController: function(controller, model) {
    this.controllerFor('rents.new').set('model', model);
  },
  renderTemplate: function() {
    this.render('rents.new');
  },
  model: function(params, transition){
    let rent = this.store.createRecord("rent");
    let carId = transition.params.cashier-list.cars.car.car_id;
    //let accountType = params.accountType;
    return this.store.find("car", carId).then(car => {
      rent.set("car", car);
      //operation.set("accountType",accountType);
      return rent;
    });
  }
});

можешь что-нибудь посоветовать?

kirzas commented 9 years ago

router у меня такой:

 this.resource("cashier-list", function() {
    this.resource("cashier-list.cars",{ path: "cars" }, function(){
      this.resource("cashier-list.cars.car", { path: "/:car_id" }, function() {
        this.resource("cashier-list.cars.car.rents",{ path: "rents" }, function(){
          this.route("new");
        });
      });
    });
});
kirzas commented 9 years ago

взял отсюда про маршруты через точку: http://stackoverflow.com/questions/14923942/how-do-i-disambiguate-nested-routes-in-ember-js

это чтобы избежать двух маршрутов rents.new

sedovalx commented 9 years ago

Можно поставить брейкпоинт в вызов метода model и посмотреть на transaction.params. К свойству, которое содержит в себе невалидные символы, можно обращаться с таким синтаксисом: transaction.params["cashier-list"]. Нужно помнить, что в JS любой объект - это ассоциативный массив, т.е. obj.myProp - это то же самое, что и obj["myProp"].

kirzas commented 9 years ago

@sedovalx Я так и делал, чтобы все проверить. до 16 шага не доходит, на 14 выпадает с ошибкой listerror ошибка такая: Error while processing route: cashier-list.cars.car.rents.new Cannot read property 'car' of undefined TypeError: Cannot read property 'car' of undefined хотя на скрине видно, что там есть

kirzas commented 9 years ago

let carId = transition.params["cashier-list.cars.car"].car_id; так то же самое

sedovalx commented 9 years ago

Молодец, что сообразил про вариант с transition.params["cashier-list.cars.car"], но вот только в этом случае не может быть такой же ошибки. Что-то ты не договариваешь.

kirzas commented 9 years ago

похоже, что это место все же работает, но не работает подстановка другого шаблона и контроллера, на выходе как будто вообще нет такого маршрута. url меняется и все. ни ошибок, ничего.

http://stackoverflow.com/questions/16331690/emberjs-sharing-a-controller-template-for-different-routes

sedovalx commented 9 years ago

@Argelein неужели отступишь? ;)

ember debug пробовал? С точками маршруты я пока не вкуривал, другим занят. Но эта штука с переиспользованием контроллера вроде должна работать, как ожидается.

kirzas commented 9 years ago

@sedovalx да, наверняка работает, просто неясно, как ее правильно задать... да еще эта штука менялась с версиями

sedovalx commented 9 years ago

Входит в план-минимум #95

kirzas commented 9 years ago

@sedovalx у меня получилось, но есть проблема. При переходе по маршруту, машина зполняется автоматически, но в форме она не отображается. ВЫглядит так: capture Я заполнил водителя и залог вручную и сохраняить работает после этого.

Мне кажется, что проблема в том, что свойство carDisplayName модели rent не совпадает с свойством displayName модели car. Там с сервера приходит string в обоих случаях, но формат разный, с нулями и без. Еще кое-где влезают скобки фигурные, но я не готов сказать, в каких случаях, надо внимательнее смотреть.

sedovalx commented 9 years ago

Получилось переиспользовать контроллер и шаблон? Круто! Что было не так?

kirzas commented 9 years ago

Да, получилось. Я не уверен, что я делал не так. Я не стал делать unshelve, начал заново и все получилось. Но по-моему, в документации все же неверно указано, т.к. там путь к маршруту наследует вешестоящие ресурсы, а я сделал без наследывания и сработало. Может непонятно, что я имею ввиду, могу попозже с примером написать, если интересно.

Я эту задачу закрою. На разность displayName заведу отдельную задачу для сервера.

sedovalx commented 9 years ago

Путь к маршруту наследует вышестоящие ресурсы, если определен через route. Если же через resource, то не наследует, как бы глубоко он не сидел.