Rails - проверьте, сохраняется ли пользователь, проверяя, является ли адрес электронной почты, вставленный в другую форму, теперь
В моем приложении Rails 4 есть модели под названием "Пользователь" и "Пригласить".
Я разрешаю пользователям приглашать других в свои проектные команды.
Моя модель пользователя имеет атрибут с именем: электронная почта.
У меня есть модель приглашения для этой цели, она имеет следующие атрибуты:
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"
Когда пользователь приглашает другого человека присоединиться к проекту, он заполняет форму, которая собирает вышеуказанную информацию.
Затем в контроллере приглашений я пытаюсь проверить, является ли введенный адрес электронной почты уже адресом электронной почты, связанным с учетной записью любого пользователя.
В моем контроллере приглашений у меня есть:
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
Метод receient_status_known - моя попытка проверить, находится ли электронная почта, которая вставлена в новую форму приглашений, уже в базе данных на пользовательской таблице (сохраненной как электронная почта).
Если оно известно, то действие create должно назначить известный идентификатор пользователя в качестве идентификатора получателя в таблице приглашений.
Если это неизвестно, то я хочу отправить приглашенному человеку электронное письмо с приглашением создать учетную запись.
Как я могу исправить свой тест в контроллере приглашений, чтобы проверить, есть ли в таблице пользователей адрес электронной почты, указанный в новой форме приглашения?
Моя следующая попытка обновить контроллер приглашения следующим образом:
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
Когда я сохраняю это и пытаюсь отправить новую форму приглашения, я не получаю ошибок, но я получаю ошибку с перенаправлением в последней строке этого кода. Это означает, что электронное письмо не найдено в качестве соответствующего адреса "статус получателя известен". Я знаю, что адрес электронной почты, который я ввожу в новой форме приглашения, соответствует адресу электронной почты в таблице пользователя.
Любые идеи о том, что я могу попробовать дальше?
1 ответ
Я бы попробовал использовать что-то вроде этого
def recipient_status_known(email)
User.exists?(email: email)
end
Но recipient_status_known
метод используется в before_action
, Может случиться так, что recipient_status_known
метод вызывается раньше @invite
установлен в create
метод.
Предлагаемое изменение для использования аргумента email
вызовет ошибку.
На основании этого: /questions/31402909/proverte-suschestvuet-li-zapis-iz-kontrollera-v-rails/31402924#31402924