我已阅读以下教程,用于实现用户身份验证和授权的Devise + Rails + Ember。
资源
我遵循了本教程:http://pivotallabs.com/playing-with-ember-js-and-devise/
问题
我所遵循的教程与Ember-data 0.13配合得很好,但不再适用于Ember-data 1.0来登录或注册用户。现在,当我单击登录按钮时,我正在向/ users发送POST,并出现以下错误:
1)发布localhost:3000/users 422 (Unprocessable Entity)
2)未捕获TypeError:在非对象上调用Object.keys
3)如果我在登录表单上,我实际上可以在数据库中创建一个用户。 不好!
在我的登录表单中,我有一个登录按钮,该按钮映射到new_sessions控制器。行动如下:<div class="button" {{action save}}><span class="btn-text">Login</span></div>
编辑:我认为主要的错误来源是用户路线。
使用Ember 0.13考虑以下旧代码:
/routes/users.js
App.UsersNewRoute = Ember.Route.extend({
model: function() {
return App.User.createRecord();
},
setupController: function(controller, model) {
controller.set('content', model);
}
});
App.SessionsNewRoute = Ember.Route.extend({
model: function() {
return App.Session.createRecord();
},
setupController: function(controller, model) {
controller.set('content', model);
}
});
在Ember-data 1.0中,此路由不再使用setupController。您可以在此处阅读更多内容:http://blog.crowdint.com/2013/09/10/upgrading-your-old-ember-js-application.html
代码看起来像
/routes/users.js
App.UsersNewRoute = Ember.Route.extend({
model: function() {
return this.store.createRecord('user');
}
});
App.SessionsNewRoute = Ember.Route.extend({
model: function() {
return this.store.createRecord('session');
}
});
SessionNewRoute无法通过在商店中创建记录来返回会话。
CODE
Ember Initializer :
/initializer/currentUser.js
App.initializer({
name: 'currentUser',
initialize: function(container) {
var store = container.lookup('store:main');
var user = App.User.find('current');
container.lookup('controller:currentUser').set('content', user);
container.typeInjection('controller', 'currentUser', 'controller:currentUser');
}
});
Ember ROUTES
routes / users.js
App.UsersNewRoute = Ember.Route.extend({
model: function() {
return this.store.createRecord('user');
}
});
App.SessionsNewRoute = Ember.Route.extend({
model: function() {
return this.store.createRecord('user');
}
});
App.SessionsDestroyRoute = Ember.Route.extend({
enter: function() {
var controller = this.modelFor('currentUser');
controller.set('content', undefined);
App.Session.find('current').then(function(session) {
session.deleteRecord('user');
controller.store.commit();
});
this.transitionTo('index');
}
});
$(function() {
var token = $('meta[name="csrf-token"]').attr('content');
$.ajaxPrefilter(function(options, originalOptions, xhr) {
xhr.setRequestHeader('X-CSRF-Token', token);
});
});`
Rails会话控制器
控制器/ sessionscontroller.rb:
class SessionsController < ApplicationController
respond_to :json
def create
user = User.find_for_database_authentication(email: params[:session][:email])
if user && user.valid_password?(params[:session][:password])
sign_in user
render json: {
session: { id: user.id, email: user.email }
}, status: :created
else
render json: {
errors: {
email: "invalid email or password"
}
}, status: :unprocessable_entity
end
end
def show
user = User.find(params[:id])
end
def destroy
sign_out :user
render json: {}, status: :accepted
end
end
EMBER会话控制器
控制器/ sessions_new_controller.js
App.SessionsNewController = Ember.ObjectController.extend({
actions: {
save: function() {
var self = this;
this.content.save().then(function() {
var userJSON = self.content.getProperties();
userJSON.id = 'current';
var object = self.store.load(App.User, userJSON);
var user = App.User.find('current');
self.get('controllers.currentUser').set('content', user);
self.transitionToRoute('colonies');
});
},
cancel: function() {
this.content.deleteRecord('user');
this.transitionToRoute('colonies');
}
}
});
Ember CurrentUser控制器
控制器/ current_user_controller.js
App.CurrentUserController = Ember.ObjectController.extend({
isSignedIn: function() {
return this.get('content') && this.get('content').get('isLoaded');
}.property('content.isLoaded')
});
商品
Javascript角/ store.js
App.Store = DS.Store.extend({
adapter: '_ams'
});
如果删除适配器'_ams',则对象错误不再存在。如果有人对我的会话/新视图发布到用户控制器的原因以及如何解决此问题有任何意见,请提前感谢您的时间!