0

Rails 4 アプリに User と Invite というモデルがあります。

ユーザーが自分のプロジェクト チームに他のユーザーを招待できるようにします。

私のユーザー モデルには、:email という属性があります。

この目的のために招待モデルがあります。次の属性があります。

create_table "invites", force: :cascade do |t|
    t.string   "email"
    t.integer  "project_id"
    t.integer  "sender_id"
    t.integer  "recipient_id"
    t.string   "token"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.boolean  "accepted",     default: false
    t.date     "expiry"

ユーザーが別の人をプロジェクトに参加するよう招待するとき、その人は上記の情報を収集するフォームに記入します。

次に、招待コントローラーで、入力されたメールアドレスが既にユーザーのアカウントに関連付けられているメールアドレスであるかどうかを確認しようとしています。

私の Invites Controller には、次のものがあります。

class InvitesController < ApplicationController
  before_action :get_project
  before_action :recipient_status_known, only: :create

  def index
    @invites = @project.invites
  end

  def new
    # @invite = Invite.new
    @invite = @project.invites.build
  end

  def create
    @invite = Invite.new(invite_params)
    @invite.sender_id = current_user.profile.id

    # @project = Project.find(params[:project_id])

    if @invite.save && @recipient_status_known
        @invite.recipient_id = @invite.email.user.id  

        #send existing user email invitation to join project team
        InviteMailer.existing_user_invite(@invite).deliver_later 
        format.html { redirect_to @project, notice: 'Invitation sent'  }

         #Add the user to the user group - inivte rsvp pending
         @invite.recipient.project.push(@invite.project)
      elsif @invite.save && !@recipient_status_known
        InviteMailer.new_user_invite(@invite).deliver_later 
        format.html { redirect_to @project, notice: 'Invitation sent'  }
      else
        #send new user email invitation to join site and this project team
         @invite.recipient.project.push(@invite.project)

         # InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
      end

       # oh no, creating an new invitation failed

  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_invite
      @invite = Invite.find(params[:id])
    end

    def recipient_status_known
      User.persisted?(email: @invite.email)
    end

    def get_project
      @project = Project.find(params[:project_id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def invite_params
      params[:invite].permit(:email, :project_id, :recipient_id, :token, :accepted, :expiry, :message)
    end
end

recipient_status_known メソッドは、新しい招待フォームに挿入された電子メールがユーザー テーブルのデータベース (電子メールとして保存) に既に存在するかどうかを確認する試みです。

既知の場合、作成アクションは既知のユーザー ID を招待テーブルの受信者 ID として割り当てる必要があります。

不明な場合は、招待された人に、アカウントを作成するよう招待するメールを送信したいと考えています。

ユーザーテーブルに新しい招待フォームで提供された電子メールアドレスがあるかどうかを確認するために、招待コントローラーでテストを修正するにはどうすればよいですか?

私の次の試みは、招待コントローラーを次のように更新することです。

after_filter :recipient_status_known, only: :create

def create
      @invite = Invite.new(invite_params)
      @invite.sender_id = current_user.profile.id

if @invite.save && @recipient_status_known
     @invite.recipient_id = @invite.email.user.id   
     InviteMailer.existing_user_invite(@invite).deliver_later 
     format.html { redirect_to @project, notice: 'Invitation sent'  }
     @invite.recipient.project.push(@invite.project)

elsif @invite.save && @recipient_status_known == false
  # InviteMailer.new_user_invite(@invite).deliver_later 
    format.html { redirect_to @project, notice: 'Invitation sent'  }
else
    format.html { redirect_to @project, notice: 'Something went wrong'  }
end

終わり

招待テーブルに追加された電子メールアドレスが既存のユーザーメンバーと同じかどうかを確認する私の方法は次のとおりです。

def recipient_status_known
        User.exists?(email: @invite.email)
    end

これを保存して新しい招待フォームを送信しようとすると、エラーは発生しませんが、このコードの最後の行のリダイレクトでエラーが発生します。これは、一致する「受信者ステータスが既知」のアドレスとして電子メールが見つからないことを意味します。新しい招待フォームに入力している電子メール アドレスが、ユーザーのテーブルの電子メール アドレスと一致することはわかっています。

次に試すことができるアイデアはありますか?

4

1 に答える 1

0

私はこのようなものを使用しようとします

def recipient_status_known(email)
    User.exists?(email: email)
end

しかし、recipient_status_knownメソッドは で使用されbefore_actionます。メソッドに設定するrecipient_status_known前にメソッドが呼び出されることがあります。@invitecreate

引数を使用するように提案された変更emailは、エラーを引き起こします。

これに基づく: https://stackoverflow.com/a/16682728/1702557

于 2016-09-06T04:18:15.473 に答える