2

正如我提出的问题,现在我可以轻松地在 rails 应用程序中使用 devise_invitable 模块。但是,很难迁移到 Angular 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)

我可以弄清楚问题可能出在凭证上。参数显然错过了

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

但不知道如何解决。在普通的 Rails 应用程序中,一切都很顺利。我可以将电子邮件发送到 user_invitation_path 以邀请新用户。而且我对 Angular js 真的很陌生,有人可以帮我吗?

4

1 回答 1

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请求中,我们不能直接使用email作为参数。

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

最后一切正常!!

于 2014-10-24T07:02:23.300 回答