使用Ember-data 1.0,Devise和Rails进行身份验证

时间:2014-02-13 21:33:34

标签: ruby-on-rails authentication ember.js devise authorization

我已阅读以下教程,用于实现用户身份验证和授权的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',则对象错误不再存在。如果有人对我的会话/新视图发布到用户控制器的原因以及如何解决此问题有任何意见,请提前感谢您的时间!

0 个答案:

没有答案