简而言之...
构建Ember.js应用程序以持久保存到Rails应用程序时,我应该如何处理Rails路由/ View ?我认为我只需要Rails来呈现application.html.erb布局,以便Ember.js应用程序初始化并处理路由/ View /模板。
详细信息:
具体来说,如果我访问 localhost:3000 ,在我的Ember.js应用有机会初始化之前,Rails会在项目 Controller 上执行“索引”操作。它将提示缺少索引模板。我没有index.html.erb View ,因为我的Ember.js应用程序具有 View /模板。
我应该为Rails应用程序创建空白 View 吗?我的Rails Controller 操作是否应该返回某些内容以防止其呈现 View ?还是我希望构建普通的Rails View 以与Ember.js应用程序 View /模板一起使用?
如果我创建一个空白的projects/index.html.erb并访问 localhost:3000 ,Rails将渲染它,Ember.js将初始化并从那时开始处理路由。但是,如果我直接访问 localhost:3000/projects/new ,Rails就会提示在项目 Controller 中没有采取新的操作。我在Rails端的项目 Controller 上没有"new"操作,因为我不需要它。我的Ember.js应用正在处理该 View /模板。
最终,我只是不确定与Rails应用程序一起使用Ember.js的约定。
感谢您的帮助和阅读本文...
编辑:
我省略了尝试使用Ember.js路由器使用pushState历史记录的功能的详细信息。这将使我成为非哈希网址。这就是为什么我在与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)
Rails路线:
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')
Rails Controller :
class ProjectsController < ApplicationController
def index
@projects = Project.all
respond_to do |format|
format.html
format.json { render json: @projects }
end
end
end
最佳答案
您可以采用包罗万象的路由来引导您的Ember应用程序。
这是我的一个应用程序的简化示例:
App::Application.routes.draw do
match "/login" => "sessions#new", :via => :get, :as => :login
match "/login" => "sessions#create", :via => :post
match "/logout" => "sessions#destroy", :via => :post, :as => :logout
match "/attachments/:id" => "attachments#download"
match "/avatars/:id" => "avatars#show"
root :to => 'pages#bootstrap'
# anything not matched by the above should be served the bootstrap
match "/*path" => "pages#bootstrap"
end
当使用完全无效的URL时,这有返回
200
成功而不是404
错误的缺点,因为Rails应用程序对Ember应用程序的URL结构一无所知。如果您想避免这种情况,可以在路由中复制Ember URL结构,然后将有效的所有内容都指向引导路由,而不是使用包罗万象。
关于ruby-on-rails - 我的Rails路由与pushState Ember.js路由一起使用应该看起来像什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12116804/