ruby-on-rails - 我的Rails路由与pushState Ember.js路由一起使用应该看起来像什么?

标签 ruby-on-rails ember.js routes ember-data

简而言之...

构建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/

相关文章:

ruby-on-rails - ActiveRecord 条件覆盖和 default_scope

ruby-on-rails - compass 中的 _base.scss 和 base.scss

ruby-on-rails - 如何避免刷新 gem 列表

ember.js - Emberjs 和验证

javascript - 处理多个请求,而前一个请求不会阻塞下一个请求

ruby-on-rails - NoMethodError:Roo::CSV:Class 未定义方法 `generate'

javascript - 在 coffeescript 中调用函数定义的方法

javascript - 从回调转换后的 Ember.js

node.js - 使用 hapijs 制作基本路由过滤器

routes - Angular2 在可注入(inject)服务中使用路由器