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

Другие вопросы по тегам