要するに...
Rails アプリに永続化する Ember.js アプリを構築する場合、Rails ルーティング/ビューをどのように処理すればよいですか? Rails で application.html.erb レイアウトをレンダリングするだけでよいので、Ember.js アプリがルーティング/ビュー/テンプレートを初期化して処理します。
詳細:
具体的には、Ember.js アプリが初期化される前にlocalhost:3000にアクセスすると、Rails はプロジェクトコントローラーで "index" アクションを実行します。インデックス テンプレートが見つからないというメッセージが表示されます。Ember.js アプリにはビュー/テンプレートがあるため、index.html.erb ビューはありません。
Rails アプリ用に空白のビューを作成する必要がありますか? ビューのレンダリングを防ぐために、Rails コントローラー アクションは何かを返す必要がありますか? または、Ember.js アプリのビュー/テンプレートと一緒に使用する通常の Rails ビューを作成する必要がありますか?
空白の projects/index.html.erb を作成してlocalhost:3000にアクセスすると、Rails がそれをレンダリングし、Ember.js が初期化してルーティングを処理します。ただし、localhost:3000/projects/newに直接アクセスすると、Rails はプロジェクト コントローラーに新しいアクションがないことを訴えます。私はそれを必要としないので、Rails 側のプロジェクトコントローラーに「新しい」アクションはありません。私の Ember.js アプリはそのビュー/テンプレートを処理しています。
最終的に、Rails アプリと一緒に Ember.js を使用するためにどのような規則が期待されるかはわかりません。
助けてくれて、ここまで読んでくれてありがとう...
編集:
Ember.js ルーターのpushState履歴を使用する機能を使用しようとしているという詳細は省略しました。これにより、ハッシュバン以外の URL が残ります。これが、Rails が競合してアプリケーションをルーティングする際に問題が発生する理由の 1 つです。
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