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