我应该我的Rails的路线看起来像pushState的Ember.js路线工作?(What shou

2019-07-31 04:32发布

简而言之...

当构建Ember.js应用坚持到一个Rails应用程序,我应该如何处理Rails的路由/看法? 我想我只需要Rails的渲染application.html.erb布局使Ember.js应用程序初始化和处理路由/视图/模板。

细节:

特别是如果我访问本地主机:3000,我Ember.js的应用程序有机会初始化之前,Rails的命中项目控制器上的“指数”行动。 它会抱怨缺少指数模板。 我没有index.html.erb视图我Ember.js的应用程序都是有视图/模板。

我应该创建Rails应用程序空白看法? 如果我的Rails控制器动作是返回的东西,以防止它呈现视图? 或者,我希望建立正常的Rails的观点去旁边的Ember.js应用程序的意见/模板?

如果我创建一个空白的项目/ index.html.erb和访问本地主机:3000,Rails会渲染它,Ember.js将初始化并处理从此路由。 但是,如果我访问本地主机:3000 /项目/新 Rails的直接抱怨没有在项目控制器中的新动作。 我没有在铁轨上侧项目控制器上的“新”的动作,因为我并不需要它。 我Ember.js应用程序正在处理该视图/模板。

最终,我只是不确定是什么惯例,预计将用Ember.js沿着一侧的Rails应用程序。

感谢您的帮助和远阅读本...

编辑:

我离开了,我正在试图使用Ember.js路由器的使用能力的详细pushState的历史。 这将使我非hashbang的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)

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的控制器:

class ProjectsController < ApplicationController
  def index
    @projects = Project.all

    respond_to do |format|
      format.html
      format.json { render json: @projects }
    end
  end
end

Answer 1:

你可以有它自举你的灰烬应用一个包罗万象的路线。

下面是从我的应用程序的一个简化的例子:

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

这有返回的下行200 ,而不是成功404将完全无效的URL时,为Rails应用程序并不知道灰烬应用程序的URL结构的任何错误。

如果你想避免这种情况,你可以在路线复制您的灰烬URL结构,只是通过对引导路线点都有效,而不是使用杂物箱的。



Answer 2:

另一个更新:我一直在使用自启动船坞的教程方法来处理我的Rails路线的pushState的Ember.js应用。 下面是一个例子的Rails routes.rb

EmberApp::Application.routes.draw do
    class FormatTest
      attr_accessor :mime_type

      def initialize(format)
        @mime_type = Mime::Type.lookup_by_extension(format)
      end

      def matches?(request)
        request.format == mime_type
      end
    end

    get '*foo', :to => 'ember#index', :constraints => FormatTest.new(:html)
    get '/', :to => 'ember#index', :constraints => FormatTest.new(:html)
end


Answer 3:

我发现这个职位上回应了特定布局的所有HTML请求。 这就是我目前使用和似乎运作良好。 唯一的限制是,我可以不再有任何非Ember.js驱动正常的HTML视图。 举例来说,我不能有灰烬之外USER_SESSION登录/注销形式。 我想我会船到桥头时,如果我到那里。

我仍然不知道这是处理我原来问题的最佳途径,但下面是我的当前设置。 家用/ show.html.erb是一个空白Rails视图。

控制器:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :render_default_view

  private
    def render_default_view
      return if request.xhr?
      respond_to do |format|
        format.html { render 'home/show' }
      end
    end
end

class HomeController < ApplicationController
  def show
  end
end

class ProjectsController < ApplicationController
  def new
  end

  def index
  end

  def show
  end
end

路线:

DesignArchive::Application.routes.draw do
  resources :projects, :only => [:new, :index, :show]

  namespace :api do
    resources :projects, :only => [:create, :index, :show, :destroy]
  end

  root :to => 'home#show'
end


Answer 4:

我建议你只有一个控制器,一个动作渲染空视图,刚刚初始化灰烬应用程序( HomeController举例)。

那么,这是一个必须管理路由(所有路由开始灰烬路由器#/ )。

因此,所有其他的Rails路线只是一个API,它会返回一些JSON(由灰烬应用程序使用)。



文章来源: What should my Rails routes look like to work with pushState Ember.js routes?