5

Rails アプリケーションに devise_invitable をインストールしました。新しい招待状の作成は正常に機能します。

招待状のリストを管理するためのビューを作成し、フォーム ボタンを作成して、管理者が未処理の招待状を削除できるようにしました。コードは次のとおりです。

<%= link_to "Cancel Invitation", remove_user_invitation_path(invitation_token: invited.invitation_token), confirm: "Are you sure?", class: 'btn btn-mini btn-danger' %>

結果は常に「指定された招待トークンが無効です!」というエラーになります。

サーバーのログを見ると、次のように表示されます。

Started GET "/invitation/remove?invitation_token=f4e26062f27c7cc32a60e2024b9dba2b1350abba" for 127.0.0.1 at 2013-10-28 15:07:44 -0700
Processing by Devise::InvitationsController#destroy as HTML
Parameters: {"invitation_token"=>"f4e26062f27c7cc32a60e2024b9dba2b1350abba"}
User Load (2.9ms)  SELECT "users".* FROM "users" WHERE "users"."invitation_token" = '46488d68fb36387ec639d5d6b9749273b56561a944f76eeefb2f5294ea5225e6' LIMIT 1

これは、delete メソッドが未加工の招待トークンを想定していないことを示唆しています。(これはセキュリティの観点から理解できます。)

remove_user_invitation_path にはどのような値を渡す必要がありますか?

4

2 に答える 2

5

私は現在まったく同じものを構築していますが、同じ問題に遭遇しました。

私が見つけたのは、Devise-Invitableがリンクトークンを受け入れるとき、実際には「生の」トークンの暗号化されたバージョンであるということです。生のトークンは永続化されません。(招待された) ユーザー オブジェクトのインスタンス変数です。( lib/devise_invitable/model.rb の generate_invitation_token() を参照)

既に一覧ページにアクセスしているため、元のユーザー オブジェクトはなくなって久しく、残っているのは永続化されたものだけです。

これを回避する方法がいくつかあります。ユーザーが招待されたときに raw_invitation_token を永続化します。(これを行うには、ユーザーに別の列を追加し、関連する invoke() メソッドをオーバーライドします。これは、複数の保存や魅力的なモンキー パッチですぐに厄介になります。)

私は道をたどり始め、約 90% の道のりをたどりましたが、これが機能したとしても、標準の削除エンドポイントは実際にはユーザーがログインしていないことを想定しているため、なぜそれを再利用する必要があるのか​​を再考する必要がありました。とにかくルート?

したがって、私の現在のソリューションには新しいエンドポイントが含まれます。これは、1) User.find_by_invitation_token() 以外の別のファインダー メソッドを使用し (トークンを復号化します)、ログアウトしていることを確認しません:-)

例えば。

class InvitationsController < ApplicationController
  ...

  before_filter :user_from_invitation_token

  def remove
    User.destroy(@user.id)
    flash[:notice] = 'Invitation removed'
    redirect_to company_users_path
  end

  private

  def user_from_invitation_token
    unless params[:invitation_token] && @user = @company.invited_users.where(invitation_token: params[:invitation_token]).first
      flash[:error] = 'Invitation not found'
      redirect_to company_users_path
    end
  end
  ...

これは WIP であり、ソリューションに 100% 満足しているわけではありませんが、招待状を管理するための UI を構築している場合、Devise-invitable がすぐに提供するものを超えていることは理にかなっています。

于 2013-11-02T13:04:07.520 に答える
0

私は招待管理システムを構築しており、devise_invitable を使用して送信された招待を削除/削除するための最新のソリューションがあるかどうかに興味があります。

于 2014-12-18T17:23:26.767 に答える