如何在我的 Rails 应用程序中导航到 Ember 路由?

How do I navigate to an Ember Route within my Rails application?

我有一个非常复杂的交互式页面作为我正在处理的 Rails 应用程序的一部分,它实际上是一个 SPA。我想利用 Ember 来做到这一点,这样我就有了更易于管理的代码。我真正需要 Rails 的只是在此页面上来回传送数据。使用 Ember 的另一个原因是我没有所有这些讨厌的 jQuery 用 JS 编写的单行视图模板(我更喜欢使用 CoffeeScript)。

我按照 ember-cli-rails gem 的自述文件中的说明安装并配置了 Ember-CLI。我为我想使用的应用程序的任何部分创建了一个单独的布局 Ember。我为 Products 设置了一条路线,以包括 Ember JS 和 CSS 资源。我现在可以在我的 Rails 应用程序中看到此路由页面上的 "Welcome to Ember" 消息。

但我无能为力。我试图为这个名为 products 的小 Ember 应用程序创建一个 "About" 部分。目前我看到的问题:

我的 <ember app>/routes 目录中有一个 about.js.coffeee,一个在 <ember app>/controllers 目录中,一个在我必须创建的 <ember app>/views 目录中,还有一个 emblem 模板在 <ember app>/templates 目录中。

现在回答一个非常基本的问题。我如何在浏览器中调出这条路线?如果我输入路线:

http://localhost:3000/products

我得到了我的 Ember 页面,这是我应该做的。但是如果我输入:

http://localhost:3000/products/about

然后 Rails 当然会尝试处理该路由。这根本不是我想要的。这是我阅读的教程中缺少的步骤。我总是建议将教程放在外行面前,以便在发布之前找到漏洞。我很乐意做这份工作的志愿者,以便为社区做出贡献。

如何在我的 Rails 应用程序中导航到 Ember 路线?

你不知道。

过去有 ember-rails 可以让您通过 Rails 资产管道设置 ember。

你基本上可以做到这一点,这样你在 rails 中的根路径就足以 html 来启动 ember。这很好,而且很管用。但这是一个非常糟糕的主意。

Ember 现在通过 Ember-CLI 拥有自己的构建过程,因此我们不需要链轮或资产管道来提供 ember 及其依赖项。

Ember 也可以完美地部署静态 html 文件 - 您可以直接从 Apache 或 NGINX 传递请求(例如使用 mod_rewrite)。 SPA 只需要足够的 HTML 来启动 SPA 框架,然后它们获取数据来填充视图。

如果您将 Ember 应用植入 Rails 中,请求将不得不通过 Rack 所有中间件来呈现基本上是静态的 html 页面 - 那是很多不必要的开销。

单独关注。

现代方法是将前端 SPA 和后端分开 API。它们甚至可以由不同的团队开发。将所有内容都放在一个大存储库中既舒适又舒适,您可以推动部署 - 但将关注点分开会产生更好的应用程序。

如果您的前端应用程序不拖沓 Rails,它不仅会加载得更快。如果您的 Rails API 可以放弃与服务资产、会话和视图相关的所有部分,那么它 运行 会快得多。它变成了普通的绿色 JSON 机器,而不是猛烈的庞然大物。

路由在 ember.js

所以加载 ember server 并获得 Ember Inspector plugin。您的路线应位于 locahost:4200/about

ember 开发服务器将确保对 localhost:4200 的每个请求都呈现 index.html 页面。

如果您尝试禁用 javascript,您会注意到 locahost:4200 上的任何路径(如 locahost:4200/foo/bar/baz 将呈现相同的 html。

但通常 Ember 然后会解析请求 url 并将其传递给您的路由处理程序。

这就是您在 ember.js 中声明路由处理程序的方式:

// app/router.js
Router.map(function() {
  this.route('about', { path: '/about' });
});

所以当你 locahost:4200/about.

Ember 将呈现 templates/about.hbs。截至 Ember 2.0 浏览量已过时。相反,您有模板和组件(想想 Rails 中的部分内容)。

Ember 也将加载 app/routes/about.js(如果存在)。