Разработать супер-действие с текущей записью в пользовательском контроллере для отправки писем в Ruby на Rails - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь настроить подтверждение регистрации по электронной почте для пользователей. Я использую устройство для аутентификации. Но я не мог получить доступ к сохраненному пользовательскому ресурсу с контроллера устройства, хотя я безуспешно пробовал несколько средств. Если кто-то может помочь, это здорово !!!

Я пытаюсь отправить ссылку подтверждения зарегистрированному пользователю после того, как пользователь был сохранен. Но мне не удалось получить новые пользовательские записи, как любую обычную переменную экземпляра в контроллере устройства.

Теперь мой контроллер регистрации пользователей выглядит так:

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :select_plan, only: :new
  # Extend the default Devise gem behaviour so that 
  # the users signing up with a Pro account(plan_id 2) should be
  # saved with a Stripe subscription function
  # Otherwise, save the sign up as usual.
  def create
    super do |resource|
      # @user = User.new(configure_permitted_parameters)
      if params[:plan]
        resource.plan_id = params[:plan]
        if resource.plan_id == 2
          resource.save_with_subscription
        else
          resource.save
        end
        //These do not works and returns null
        //@user = User.find_by_email(params[:email])
        //@user = User.find(params[:id]
        //@user = resource
        UserMailer.registration_confirmation(params[:email]).deliver
        flash[:success] = "Please confirm your email address to continue"
        redirect_to root_url
      end
    end
  end
  
  private
    def select_plan
      unless (params[:plan] == '1' || params[:plan] == '2')
        flash[:notice] = "Please select a membership plan to sign up."
        redirect_to root_url
      end
    end
end

Модель пользователя:

class User < ApplicationRecord
  
  before_create :confirmation_token
  
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
         
  belongs_to :plan
  has_one :profile
  
  attr_accessor :stripe_card_token
  
  # If Pro user passes the validation for email, password etc. then call Stripe
  # and tell Stripe to add a subscription by charging customer's card
  # Stripe then returns a customer token in response 
  # Store the token id as customer id and save the user
  def save_with_subscription
    if valid?
      customer = Stripe::Customer.create(description: email, plan: plan_id, card: stripe_card_token)
      self.stripe_customer_token = customer.id
      save!
    end
  end

  private
    
    def confirmation_token
      if self.confirm_token.blank?
          self.confirm_token = SecureRandom.urlsafe_base64.to_s
      end
    end
  
  def email_activate
    self.email_confirmed = true
    self.confirm_token = nil
    save!(:validate => false)
  end
  
end

У кого-нибудь есть идея отправить электронное письмо с подтверждением от контроллера устройства? Заранее спасибо !!!

1 Ответ

0 голосов
/ 30 июля 2020

Используя devise, мы можем решить супер-требования разными способами, например, добавив действие after_create в модель User для отправки электронного письма с подтверждением. Но я думаю, что это удобное решение, потому что вам действительно нужно работать с super do your action with the devise registration controller. Добавьте коды после сохранения ресурса.

class Users::RegistrationsController < Devise::RegistrationsController

  def create
    super do |resource|

   # Your super codes here
    resource.save

    yield resource if block_given?
    if resource.persisted?

     # We know that the user has been persisted to the database, so now we can send our mail to the resource(user) now!
     UserMailer.registration_confirmation(resource).deliver
     # .... 
    end
    # ....
    end
   end
 # .....
end

Убедитесь, что устройство не предполагает двойной рендеринг или множественное перенаправление.

...