2013-10-28 2 views
2

devise_invitable을 내 레일 애플리케이션에 설치했습니다. 새 초대장을 만들면 제대로 작동합니다.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 

이 삭제 방법은 원료가 초대 토큰 기대되지 않는다는 것을 제안 : 서버 로그를 보면

, 나는 이런 식으로 뭔가를 참조하십시오. (이 점은 보안 입장에서 이해할 수 있습니다.)

remove_user_invitation_path로 전달할 값은 무엇입니까?

답변

2

나는 지금 똑같은 것을 짓고 있고, 똑같은 문제에 부딪쳤다.

Devise-Invitable accept link token이 실제로 'raw'토큰의 암호화 된 버전 일 때 발견되었습니다. 원시 토큰은 지속되지 않습니다. 즉, (초대 된) 사용자 객체의 인스턴스 변수입니다. (lib/devise_invitable/model.rb의 generate_invitation_token() 참조)

이미 사용자 목록 페이지에 있으므로 원래 사용자 객체는 오래 전에 사라 졌으므로 남은 것은 보존 된 것입니다.

사용자를 초대 할 때 raw_invitation_token을 유지하거나이 문제를 해결할 수있는 방법이 있습니다. (다른 열을 사용자에게 추가하고 관련 invite() 메소드를 재정 의하여이 작업을 수행 할 수 있습니다. 여러 저장 또는 유인 원숭이 패치를 사용하면 재빨리 불쾌 해집니다.)

경로를 시작하여 약 90 %의 실제로이 방법을 사용하더라도 표준 제거 끝 점이 실제로 사용자가 로그인하지 않을 것으로 예상됨에 따라 어쨌든 그 경로를 다시 사용해야하는 이유를 다시 생각하게되었습니다.

그래서 내 현재의 솔루션은 1) User.find_by_invitation_token() (이 토큰을 해독) 외에 다른 finder 메소드를 사용하는 새로운 엔드 포인트를 포함, 당신은 :-)

로그 아웃하고 있는지 확인 나던 예.

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를 구축하는 경우에, 당신이 고안-invitable 밖으로 제공하는 것 이상 스테핑하고 있다는 의미가 있습니다 상자의.

0

devise_invitable을 사용하여 보낸 초대장을 삭제/삭제하는 업데이트 된 솔루션이 있으면 초대 관리 시스템을 구축하고 궁금합니다.

관련 문제