2013-02-08 6 views
1

Я использую Ember 1.0.0 pre и использую адаптер REST для извлечения объекта из Rails API. Я визуализирую шаблон, если объект найден через REST API и задает найденный объект модели в качестве модели представления. Для этого я использую крючок модели в Маршруте, и все, кажется, работает нормально. Естественно, я хочу отобразить специальный шаблон/вид 404, если объект модели не найден. Проблема заключается в том, что крючок модели останавливает обработку, если адаптер REST возвращает ошибку.Как обращаться с 404 Не найдено в Ember REST Adapter

Я видел в дорожной карте ember-data, что обработка ошибок еще не поддерживается.

Я не понимаю, почему Эмбер не вызывает крючок переадресации в Маршруте, если возникает ошибка. (? И как я могу обрабатывать такие ошибки)

Вот Маршрут:

App.MyRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
    this.render('mymodel')  
    }, 
    model: function(params) { 
    return App.MyModel.find(params.id); 
    }, 
    redirect: function() { 
    // I want to redirect to another route 
    // if the model is not found via the find method. 
    // However, this hook is not called if the previous one 
    // does not return an object 
    } 
}) 

Есть ли другое решение? Я знаю, я могу проверить шаблон, если модель представления равна нулю, а затем отобразить частичный шаблон, но проблема в том, что представление вообще не отображается (я предполагаю, что именно из-за той же проблемы).

ответ

1

Что бы я делал, это создать реферат, а затем ваши маршруты расширят этот маршрут. У меня есть created a working JSFiddle for you, но, пожалуйста, позвольте мне объяснить.

Наша App.IndexRoute может содержать всю логику в App.MyRedirectRoute, а потому, что другие маршрутизаторы могут требовать такую ​​же функциональность, что лучше создать аннотацию, так что если/когда вы снова нужна эта функция, вы можете просто расширить App.MyRedirectRoute снова, чтобы предотвратить повторное код записи.

К сожалению, у Ember.JS нет логики, чтобы определить, пуста ли модель и отобразить другую страницу. Может быть, в будущем это будет реальностью! (Было бы прекрасно!), но мы можем сделать это сами.

Наша App.IndexRoute просто и красиво:

App.IndexRoute = App.MyRedirectRoute.extend({ 
    defaultRender: 'home', 
    errorRedirectTo: '404', 

    model: function(params) { 
     // We've found a model! 
     return Ember.Object.create({ params: params }); 
     // We've not found a model! 
     return null; 
    } 
}); 

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

Это renderTemplate, который содержит нашу логику для отображения соответствующего вида. И поэтому мы перегрузить метод renderTemplate в нашем реферате и сделать логический материал:

  • Если модель считается пустой от ember.js, то мы окажем вид, как указано на errorRedirectTo;
  • Если модель считается действительной, тогда мы будем отображать значение по умолчанию, как указано defaultRender.

Если модель пусто, то мы будем просто указать, что мы хотим, чтобы сделать 404 маршрут (errorRedirectTo), но по умолчанию, мы хотим, чтобы сделать маршрут по умолчанию (defaultRender).

Чтобы увидеть это в действии, взгляните на вышеупомянутый JSFiddle.Выделите строку № 27, чтобы просмотреть страницу 404, потому что объект null.

Надеюсь, это поможет!

+0

Спасибо за ваше время и долгий ответ. Действительно, это работает так, как ожидалось. Тем не менее, это не работает, если я использую 'App.MyModel.find (params.id);' Я закончил проверку того, имеет ли возвращенный объект атрибут _data. Если да, я возвращаю модель, и если нет, я возвращаю значение null. Вы считаете эту проверку безопасной? – peshkira

+0

Я бы так сказал, но если у вас есть какие-то необычные проблемы, связанные с этим, помните об этом в качестве возможной причины. – Wildhoney

+0

Были некоторые дополнительные проблемы, но я считаю, что они были вызваны из-за данных ember-данных. Поскольку я решил не использовать его, пока он не станет стабильным, ваше решение, похоже, делает работу неплохо. Так что еще раз спасибо, я принимаю ваш ответ. – peshkira

Смежные вопросы