1

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

ember-cli-rails我按照gem的 README 中的说明安装和配置了 Ember-CLI 。我已经为我想要使用 Ember 的应用程序的任何部分创建了一个单独的布局。我有一条Products设置路线以包含 Ember JS 和 CSS 资源。我现在可以在我的 Rails 应用程序中看到此路由页面上的“欢迎使用 Ember”消息。

但我不能做任何其他事情。我试图为这个名为products. 到目前为止我看到的问题:

  • ember-cli-rails gem 初始化程序不会创建views目录。这是为什么?
  • 我还没有找到一个Ember-CLI没有内置大量假设的教程。

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

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

http://localhost:3000/products

我应该得到我的 Ember 页面。但如果我说:

http://localhost:3000/products/about

当然,Rails 会尝试处理该路由。这根本不是我想要的。这是我阅读的教程中缺少的步骤。我总是建议将教程放在外行面前,以便在发布之前找到漏洞。我很乐意自愿从事这项工作,以便为社区提供一些东西。

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

4

1 回答 1

1

你没有。

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

您基本上可以做到这一点,以便您在 rails 中的根路径将呈现足够的 html 来启动 ember。很好,而且效果很好。但这是一个非常糟糕的主意。

Ember 现在通过 Ember-CLI 拥有自己的构建过程,因此我们不需要 Sprocket 或资产管道来提供 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 插件。你的路线应该在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 中的部分)。

app/routes/about.js如果 Ember 存在,它也会加载。

于 2015-10-20T12:41:39.460 回答