将devise_invitable与rails4中的角度js集成

时间:2014-10-23 16:57:00

标签: ruby-on-rails angularjs devise-invitable

正如我提出的问题,现在我可以在rails app中轻松使用devise_invitable模块。但是,很难迁移到角度js。 我正在尝试使用带有url'/users/invitation.json'的$ http.post来触发服务器端的邀请。

$scope.inviteUser = ->
  $http.post('/users/invitation.json',
    email: $scope.email
).success (data) ->
  _log "successful"

日志文件显示

Started POST "/users/invitation.json" for 127.0.0.1 at 2014-10-24 03:48:49 +1100
Processing by Devise::InvitationsController#create as JSON
Parameters: {"email"=>"sample@mail.com", "invitation"=>{"email"=>"sample@mail.com"}}
User Load (0.3ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = 1  ORDER BY "users"."id"      ASC LIMIT 1
Completed 422 Unprocessable Entity in 3ms (Views: 0.1ms | ActiveRecord: 0.3ms)

我可以发现问题可能是凭证。 params显然错过了

"authenticity_token"=>"MEAh9r7vD8cUxXQH9+qnjykHKV8OeC+fvuNW6Whsewg="

但不知道如何修复它。在普通的rails应用程序中,每件事情都顺利。我可以将电子邮件发送到user_invitation_path以邀请新用户。 而且我对棱角分明的js很新,有没有人可以帮助我呢?

1 个答案:

答案 0 :(得分:1)

几小时后我发现代码有什么问题。代码中有2个问题。首先,我应该手动添加csrf,这应该是

myAngularApp.config([
  "$httpProvider", function($httpProvider) {
     $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content');
}

或者只是一种更简单的方法是使用宝石

# Gemfile
gem 'angular_rails_csrf'

其次,在控制台中,我可以使用User.invite!(:email =>“123@example.com”)发送邀请,因为该电子邮件已被包装为User对象中的属性。所以在$ http请求中,我们不能直接使用电子邮件作为参数。

  $scope.inviteUser = ->
    user = {
      email: $scope.email
    }
    $http.post('/users/invitation',
      user: user
    )

最后一切都运作良好!!