Я хочу использовать такой стиль, как:
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-адресах вместо идентификаторов объектов
Заранее спасибо.
Судом и ошибкой я нашел способ заставить мой запрос показать работу с параметрами "красивее".
ключ использовал: 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.