簡體   English   中英

使用devise_invitable,接受后,保存彼此的友誼

[英]Using devise_invitable, upon acceptance, saving mutual friendship

我希望邀請用戶和被邀請用戶在通過 devise_invitable (gem) 接受電子郵件邀請后成為共同的朋友。

所以數據庫應該是這樣的:

 id | user_id | friend_id |         created_at         |         updated_at         
----+---------+-----------+----------------------------+----------------------------
  2 |       3 |         2 | 2020-10-13 02:42:03.33376  | 2020-10-13 02:42:03.33376
  3 |       2 |         3 | 2020-10-13 15:57:48.359378 | 2020-10-13 15:57:48.359378

這是我在從源繼承的邀請控制器中的內容。 中間從@inviting_user = User.find(current_user.invited_by_id)開始的代碼就是我插入的。

class Users::InvitationsController < Devise::InvitationsController
  

prepend_before_action :require_no_authentication, only: [:edit, :destroy]


    def update
      raw_invitation_token = update_resource_params[:invitation_token]
      self.resource = accept_resource
      invitation_accepted = resource.errors.empty?
  
      yield resource if block_given?
  
      if invitation_accepted
        if resource.class.allow_insecure_sign_in_after_accept
          flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
          set_flash_message :notice, flash_message if is_flashing_format?
          resource.after_database_authentication
          sign_in(resource_name, resource)


          ### from here is my code:
          @inviting_user = User.find(current_user.invited_by_id)
          @invited_user = User.find(current_user.id)

          @friendship = @invited_user.friendships.build(:friend_id => params[:friend_id])
          @inverse_friendship = @inviting_user.friendships.build(:friend_id => params[:friend_id])

          if @friendship.save and @inverse_friendship.save
            # flash[:notice] = "Added friend."
            # redirect_back fallback_location: new_user_invitation_path
          else
            # flash[:error] = "Unable to add friend."
            # redirect_back fallback_location: new_user_invitation_path
          end
          ### my code end

          respond_with resource, location: after_accept_path_for(resource)

        else
          set_flash_message :notice, :updated_not_active if is_flashing_format?
          respond_with resource, location: new_session_path(resource_name)
        end
      else
        resource.invitation_token = raw_invitation_token
        respond_with_navigational(resource) { render :edit }
      end
    end

end

問題是沒有建立友誼。 我很感激任何建議。

源代碼控制器: https : //github.com/scambra/devise_invitable/blob/master/app/controllers/devise/invitations_controller.rb

我開始認為這兩行是問題所在,因為 @inviting_user 和 @invited_user 似乎已設置。 在 devise_invitable 的上下文中,您在這里看到任何問題嗎?

@friendship = @invited_user.friendships.build(:friend_id => params[:friend_id])
@inverse_friendship = @inviting_user.friendships.build(:friend_id => params[:friend_id])

當我將@friendship.save 切換到@friendship.create 時! 我得到“你是說 create_user 嗎?”

你真的不需要這個代碼的一小部分。 幾乎所有的 Devise 控制器都產生了,所以你可以通過傳遞一個塊來簡單地使用 super 方法:

class Users::InvitationsController < Devise::InvitationsController
  def update
    super do |user|
      Friendship.transaction do 
        begin
          user.friendships.create!(friend_id: user.invited_by_id)
          User.find(user.invited_by_id)
              .friendships.create!(friend_id: user.id)
        rescue ActiveRecord::RecordInvalid
          flash[:error] = "Unable to add friend."
          redirect_back fallback_location: new_user_invitation_path
          raise ActiveRecord::Rollback
        end
      end
    end
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM