2

私が尋ねる質問のように、devise_invitable モジュールを Rails アプリで簡単に使用できるようになりました。ただし、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');
}

または、より単純なアプローチの 1 つに、gem を使用する方法があります

# 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 に答える