Использование чистых строковых URL-адресов вместо URL-адресов с идентификаторами объектов mongo с помощью ui-router

0

Я хочу использовать такой стиль, как:

http://mysite/performer_ratings/гитаристы

вместо типичных идентификаторов монго в URL-адресах:

http://mysite/performer_ratings/56623de898tt752ae45

Я использую угловой ui-router для использования ui-srefs для создания и загрузки шаблона, который я хочу.

моя проблема в том, что я не могу понять, как взять отформатированное имя из запроса и использовать его для извлечения объекта темы, в котором я нуждаюсь. (Кстати, я использую свойство "topic_url" для хранения "гитаристов" вместо названия "Guitar Players")

я -can-приложение, работающее с уродливыми URL-адресами:

//view controller
$http.get('api/topics/' + $stateParams.id).success(function(topic){
  $scope.topic = topic;}

а также

// api/topic/topic.controller
// Get a single topic
exports.show = function(req, res) {
 Topic.findById(req.params.id, function (err, topic) {
  if(err) { return handleError(res, err); }
  if(!topic) { return res.status(404).send('Not Found'); }
  return res.json(topic);
 });
};

но я не могу этого сделать:

//view
// Get a single topic
exports.show = function(req, res) {
 $http.get('api/topics/' + $stateParams.topic_url).success(function(topic){
  $scope.topic = topic;
 });
};



//in api/topic/topic.controller
exports.show = function(req, res){
 Topic.findOne({topic_url: req.params.topic_url}, function(err, topic){
  if(err) { return handleError(res, err); }
  if(!topic) { return res.status(404).send('Not Found'); }
  return res.status(200).json(topic);
 });
};

Я не могу хорошо взглянуть на объект req, чтобы узнать, как получить доступ к нему, и googling не помог мне там. Это может быть простая вещь, которая решает мою проблему.

Я хочу использовать альтернативные способы использования свойства имени в моих URL-адресах вместо идентификаторов объектов

Заранее спасибо.

Теги:
angular-ui-router
mongoose

1 ответ

1
Лучший ответ

Судом и ошибкой я нашел способ заставить мой запрос показать работу с параметрами "красивее".

ключ использовал: req.params.id вместо req.params.user_url

что, хотя моя настройка ui-router была такой:

  .state('performer_rating', {
    url: '^/performer_rating/:topic_url',
    templateUrl: 'app/topic/performer_rating.html',
    controller: 'PerformerRatingCtrl'
  });

и мой html, создающий URL-адрес http://mysite/performer_ratings/guitar-players, был следующим:

 <li class="topic-pills" ng-repeat="rating_topic in list_topics" ng-  class="{active: isActive('{{rating_topic.topic_url}}') }">
    <a ui-sref="performer_rating({topic_url:rating_topic.topic_url})">{{rating_topic.title}}</a>
 </li>

Я предполагаю, что mongoose занимает часть URL-адреса после окончательного "/" и присваивает его параметрам. Хотя даже я его называл: topic_url в config $ stateProvider?

Полагаю, теперь это имеет смысл, и я понял это. Контроллер представления действительно использует: topic_url, но контроллер api вызывает последнюю часть ".id", несмотря ни на что. (Его также интересно, что это.id, а не._id... подчеркивание, необходимое для доступа к id с объектом)

Я также, похоже, сохранил функцию REST api с условным if (req.params.id)? Не всегда ли это было бы правдой? даже если я с ним справился:

// Get a single topic
exports.show = function(req, res) {
  if(req.params.id){
// handles pretty urls
    Topic.findOne({topic_url: req.params.id}, function(err, topic){
      if(err) { return handleError(res, err); }
      if(!topic) { return res.status(404).send('Not Found'); }
      return res.status(200).json(topic);
})
  }else{
    Topic.findById(req.params.id, function (err, topic) {
      if(err) { return handleError(res, err); }
      if(!topic) { return res.status(404).send('Not Found'); }
      return res.status(200).json(topic);
    });
  }
};

! Я все равно буду любить отзывы от других, чтобы узнать, есть ли лучший способ "angularjs" для достижения моей цели стиля url.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню