Маршруты Ember и маршруты Rails

Это вопрос, который возник у меня с тех пор, как я начал изучать Ember, чтобы посмотреть, как он может работать с Rails.

В Rails есть файл route.rb с любым количеством существующих маршрутов. Ember имеет свой отдельный набор маршрутов.

Как браузер узнает, что нужно искать маршрут Ember, если маршрут не существует в rails?

Казалось бы логичным, что рельсы должны были бы перенаправить браузер на Ember, но я нигде не видел, чтобы это было написано.

В большинстве случаев, когда существует приложение rails, маршрут в route.rb играет роль преобразования ресурса в API, что делает данные доступными через URL-адрес.

Эта часть была легкой. Я вижу данные, используя этот url.json

Сейчас я нахожусь на этапе попытки заставить браузер распознавать один-единственный маршрут (из многих существующих в рельсах) через маршрутизацию Ember.

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

У меня такое ощущение, что маршрут просто волшебным образом распознается браузером (без упоминания маршрутизации Ember в route.rb) на основе того, что происходит за кулисами во фреймворке Ember, но это не то, что я испытал в реальности.

Я продолжаю получать ошибку маршрутизации:

Started GET "/newslinks" for 127.0.0.1 at 2013-08-08 12:44:30 -0700 ActionController::RoutingError (No route matches [GET] "/newslinks"):

Вот мое приложение.js

//= require jquery
//= require jquery-ui
//= require jquery_ujs
//= require jquery-fileupload/basic
//= require jquery-fileupload/vendor/tmpl
//= require chosen-jquery
//= require bootstrap
//= require bootstrap-notify
//= require jquery.limit-1.2.source
//= require bootstrap-switch
//= require handlebars
//= require ember
//= require ember-data
//= require_self
//= require app

Вот мой app.js:

App = Ember.Application.create({
  LOG_TRANSITIONS: true,
  ready: function() {
    console.log('App ready');
  }
});

App.Router.map(function() {
    this.resource('newslinks', { path: '/' });
});

App.IndexRoute = Ember.Route.extend({
  redirect: function() {
    this.transitionTo('newslinks');
  }
});

App.NewslinksRoute = Ember.Route.extend({
  model: function() {
  return App.Newslink.find();
  }
});

DS.RESTAdapter.reopen({
  namespace: 'api/v1'
});

App.Store = DS.Store.extend({
  revision: 13
});

App.Newslink = DS.Model.extend({
  name: DS.attr('string')
});

Мне сказали, что на самом деле это должно работать, но это не так. Не знаю, к кому еще обратиться за помощью на данный момент, поэтому, если у вас есть какие-либо рекомендации или у вас есть немного времени и вы хотите заняться этим вопросом на фрилансе, пожалуйста, дайте мне знать.

Изменить

Добавление route.rb для справки:

namespace :api do
    namespace :v1 do
      resources :newslinks
    end
  end

person Brian McDonough    schedule 08.08.2013    source источник


Ответы (1)


Как браузер узнает, что нужно искать маршрут Ember, если маршрут не существует в rails?

Это не так. Когда вы вводите URL-адрес в браузере, он делает запрос к серверу, затем рельсы должны ответить некоторым контентом. Таким образом, в этом случае, когда запрашивается URL-адрес «/newslinks», вы хотите, чтобы рельсы отвечали HTML-страницей, которая включает ваше приложение ember.

Когда эта страница загружена, приложение ember загрузится, и отсюда ember-router будет использоваться для обработки ссылок в контексте вашего приложения ember.

Есть смысл?

person Mike Grassotti    schedule 08.08.2013
comment
Правильно. Rails не знает и не заботится о ember, но его следует настроить для обслуживания вашего приложения ember, когда запрашивается этот URL. - person Mike Grassotti; 09.08.2013
comment
Хорошо, отлично. Итак, я настроил свой ресурс как API (добавлен код к вопросу выше), но он обрабатывает только данные. Чего я не знаю, так это как перенаправить, чтобы /newslinks обрабатывался ember: - person Brian McDonough; 09.08.2013
comment
Хорошо, теперь вам понадобится маршрут rails для обслуживания приложения ember. Добавьте что-то вроде get 'newslinks', to: 'ember#main' в ваш route.rb. Затем добавьте app/controllers/ember_controller.rb и app/views/ember/main.html.erb. Убедитесь, что ваше представление содержит ссылку на application.js и ваши шаблоны рулей. - person Mike Grassotti; 09.08.2013
comment
Кстати, драгоценный камень ember-rails сгенерирует большую часть этого для вас, так что в будущем попробуйте его. github.com/emberjs/ember-rails — я также рекомендую ознакомиться с этим руководством < a href="http://www.devmynd.com/blog/2013-3-rails-ember-js" rel="nofollow noreferrer">devmynd.com/blog/2013-3-rails-ember-js - person Mike Grassotti; 09.08.2013
comment
Я использую ember-rails, так что что-то не так. Я могу заставить приложение отображаться, поместив контроллер новостных ссылок в контроллер приложения в рельсах, и теперь я вижу Ember в консоли, но все еще не отображаю шаблон Ember, что имеет смысл, поскольку он отображает представление из рельсов. Есть ли способ отобразить шаблон Ember внутри шаблона rails? - person Brian McDonough; 09.08.2013
comment
Да так всегда и работает. Шаблоны Ember не связаны с рельсами, они никак не конфликтуют. Я бы начал с того, что вставил шаблоны hbs в строку с помощью тегов script в вашем erb. Как только это заработает, загляните в readme ember-rails, чтобы получить советы по предварительной компиляции шаблонов hbs. - person Mike Grassotti; 09.08.2013
comment
Хорошо, спасибо, Майк. Тем не менее, я еще не видел, чтобы шаблон отображался в моем представлении rails с использованием <%= javascript_include_tag 'templates/newslinks.handlebars' %>, но сегодня я многое понял. Спасибо. - person Brian McDonough; 09.08.2013