简而言之...
在构建 Ember.js 应用程序以持久保存到 Rails 应用程序时,我应该如何处理 Rails 路由/视图?我想我只需要 Rails 来呈现 application.html.erb 布局,以便 Ember.js 应用程序初始化并处理路由/视图/模板。
细节:
具体来说,如果我访问localhost:3000,在我的 Ember.js 应用程序有机会初始化之前,Rails 会在项目控制器上点击“索引”操作。它会抱怨缺少索引模板。我没有 index.html.erb 视图,因为我的 Ember.js 应用程序有一个视图/模板。
我应该为 Rails 应用程序创建空白视图吗?我的 Rails 控制器操作是否应该返回某些内容以阻止它呈现视图?或者我是否希望构建普通的 Rails 视图以与 Ember.js 应用程序视图/模板一起使用?
如果我创建一个空白项目/index.html.erb 并访问localhost:3000,Rails 将呈现它,Ember.js 将从那时起初始化并处理路由。但是,如果我直接访问localhost:3000/projects/new,Rails 会抱怨项目控制器中没有新的操作。我在 Rails 端的项目控制器上没有“新”操作,因为我不需要它。我的 Ember.js 应用程序正在处理该视图/模板。
最终,我只是不确定将 Ember.js 与 Rails 应用程序一起使用的约定是什么。
感谢您的帮助和阅读到目前为止...
编辑:
我省略了我尝试使用 Ember.js 路由器使用pushState历史记录的能力的细节。这会给我留下非散列 URL。这就是为什么我在处理 Rails 竞争路由我的应用程序时遇到问题的原因之一。
Rails 应用程序布局:
<html>
<body>
<section id="design-archive"></section>
</body>
</html>
Ember.js 应用程序:
@DA = Em.Application.create
name: 'Design Archive'
VERSION: '0.1'
rootElement: '#design-archive'
ApplicationController: Em.Controller.extend()
ApplicationView: Em.View.extend
templateName: 'application'
DA.initialize(DA.Router)
铁路路线:
DesignArchive::Application.routes.draw do
resources :clients, :only => [:new, :create, :index, :show, :destroy]
resources :projects, :only => [:new, :create, :index, :show, :destroy]
root :to => 'projects#index'
end
Ember.js 路由:
DA.Router = Em.Router.create
location: 'history'
root: Em.Route.extend
index: Em.Route.extend
route: '/'
redirectsTo: 'projects'
# Actions
doProjects: (router) ->
router.transitionTo('projects')
doProjectsNew: (router) ->
router.transitionTo('newProject')
# Routes
projects: Em.Route.extend
route: '/projects'
index: Em.Route.extend
router: '/'
connectOutlets: (router) ->
router.get('applicationController').connectOutlet('projects', DA.Project.find())
showProject: Em.Route.transitionTo('project')
project: Em.Route.extend
route: '/projects/:project_id'
connectOutlets: (router, project) ->
router.get('applicationController').connectOutlet('project', project)
projectsIndex: Em.Route.transitionTo('projects')
newProject: Em.Route.extend
route: '/projects/new'
connectOutlets: (router) ->
router.get('applicationController').connectOutlet('projectsNew')
导轨控制器:
class ProjectsController < ApplicationController
def index
@projects = Project.all
respond_to do |format|
format.html
format.json { render json: @projects }
end
end
end