更新:在答案底部描述的 ember 应用程序中访问 current_user 和 current_company rails 方法的方法和github 演示应用程序也已更新。
如果我正确理解您要执行的操作,以下是快速完成工作的一种方法。如果有人有更好的答案,请编辑我的问题。我在github 上放了一个 ember + rails + devise 演示应用程序,它结合了这个问题的答案和我最后一个 ember.js stackoverflow 问题,以表明一切正常。下面我使用模型 Post 而不是 Article,但它的概念基本相同。
1) 在 Rails Companies 视图中,在特定公司 link_to click 上,您应该将 company 变量传递给 rails 控制器操作,该操作将继续传递给应用程序帮助器方法以设置 current_company 的设计会话变量。
<% @companies.each do |company| %>
<%= link_to 'Company Dashboard', set_current_company_company_path(:id => company) %>
<% end %>
class CompaniesController < ApplicationController
def set_current_company
session[:company_id] = params[:id]
redirect_to assets_path
end
...
end
class ApplicationController < ActionController::Base
...
helper_method :current_company
def current_company
@current_company ||= Company.find_by_id!(session[:company_id])
end
...
end
App::Application.routes.draw do
resources :companies do
member do
get :set_current_company
end
end
...
set_current_company 方法将设置 current_company 变量会话范围并将用户重定向到包含您的 ember 应用程序的 assets/index.html.erb rails 视图。
2) 您现在需要为要在 json api/ember 模型中使用的 current_company 的 Posts(和 Comments、Company_Memberships)限定 Rails api 数据,如下所示:
class PostsController < ApplicationController
def index
@posts = Post.where(company_id: current_company.id)
render json: @posts
end
def create
@post = Post.new(params[:post].merge :company_id => current_company.id)
respond_to do |format|
if @post.save
render json: @post, status: :created, location: @post
else
render json: @post.errors, status: :unprocessable_entity
end
end
end
3)然后您应该以正常方式通过AMS将数据序列化到ember应用程序:
class PostSerializer < ActiveModel::Serializer
attributes :id, :title, :body, :company_id, :user_id
has_many :comments
end
4) 然后到 ember 模型。
App.Post = DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
comments: DS.hasMany('App.Comment')
});
5) Ember 控制器、视图和模板应按预期运行。查看演示应用程序以查看超级基本实现。
为了获得对 current_user 和 current_company 的访问权限,请使用active_model_serializers 元数据序列化,然后使用这个人的临时解决方案来映射您的序列化程序,以便它获取元数据并将其设置为您的 ember 应用程序中的全局变量。这可能不是最佳实践,但就目前而言,它可以完成工作。
1)首先,设置你的 store.js 从你的 json 中获取元数据并将其设置为序列化程序中的全局变量:
App.CustomRESTSerializer = DS.RESTSerializer.extend({
extractMeta: function(loader, type, json) {
var meta;
meta = json[this.configOption(type, 'meta')];
if (!meta) { return; }
Ember.set('App.metaData', meta);
this._super(loader, type, json);
}
});
App.Store = DS.Store.extend({
revision: 11,
adapter: DS.RESTAdapter.create({
bulkCommit: false,
serializer: App.CustomRESTSerializer
}),
});
App.ready = function() {
App.CompanyMembership.find();
}
2)其次,在您的 rails company_memberships_controller.rb 呈现元数据:
render json: @company_memberships, :meta => {:current_user => current_user, :current_company => current_company}
3) 最后,直接从您的模板中调用任何 current_user 或 current_company 属性:
Logged in with: {{App.metaData.current_user.email}}
<br>
Current Company: {{App.metaData.current_company.name}}