Rails User Sign Up Mail Подтверждение - PullRequest
4 голосов
/ 12 декабря 2011

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

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

Я сгенерировал модель приглашения.rb

  class Invitation < ActiveRecord::Base
  belongs_to :sender, :class_name => 'User'
  has_one :recipient, :class_name => 'User'

  validates_presence_of :recipient_email
  validate :recipient_is_not_registered
  validate :sender_has_invitations, :if => :sender

  before_create :generate_token
  before_create :decrement_sender_count, :if => :sender

  private

  def recipient_is_not_registered
    errors.add :recipient_email, 'is already registered' if User.find_by_email(recipient_email)
  end

  def sender_has_invitations
    unless sender.invitation_limit > 0
      errors.add_to_base 'You have reached your limit of invitations to send.'
    end
  end

  def generate_token
    self.token = Digest::SHA1.hexdigest([Time.now, rand].join)
  end

  def decrement_sender_count
    sender.decrement! :invitation_limit
  end 
  #attr_accessible :sender_id, :recipient_email, :token, :sent_at
end

и мой invitiation_controller.rb

class InvitationsController < ApplicationController
  def new
    @invitation = Invitation.new
  end

  def create
    @invitation = Invitation.new(params[:invitation])
    @invitation.sender = current_user
    if @invitation.save
      if logged_in?
        Mailer.deliver_invitation(@invitation, signup_url(@invitation.token))
        flash[:notice] = "Thank you, invitation sent."
        redirect_to projects_url
      else
        flash[:notice] = "Thank you, we will notify when we are ready."
        redirect_to root_url
      end
    else
      render :action => 'new'
    end
  end
end

Что еще мне нужно отредактировать?как подключить это к уже существующей регистрации пользователя и логину, который работает нормально?

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

У вас уже должен быть UsersController или что-то подобное для целей регистрации, к которому вы в настоящее время обращаетесь через именованный маршрут signup_url. Предположим, что этот маршрут теперь выглядит примерно так:

http://localhost:3000/register/code_here

Все, что вам нужно сделать сейчас, это проверить приглашение в действии контроллера и обработать его соответственно так:

def new
  invite = Invite.find_by_token(params[:id]

  if invite.nil?
    redirect_to root_path, :notice => "Sorry, you need an invite to register"
  end

  @user = User.new(:email => invite.recipient_email)

end

def create
  invite = Invite.find_by_token(params[:token]

  if invite.nil?
    redirect_to root_path, :notice => "Sorry, you need an invite to register"
  end

  begin

    invite.nil.transaction do
      invite.nil.destroy!
      @user = User.create(params[:user)
    end

    redirect_to my_dashboard_path, :notice => "Yay!"

  rescue ActiveRecord::RecordInvalid => invalid
     render :new, :alert => "Validation errors"
  end

end

Без кода приглашения вы просто будете перенаправлены на корневую страницу. Вы можете СУШИТЬ эту проверку, хотя. Когда кто-то использует код приглашения, вы можете удалить его из базы данных. Я завернул это в транзакции, но это зависит от вас (создание пользователя может быть более важным).

Если вы хотите создать страницу, которая позволяет пользователям создавать приглашения без регистрации, просто не добавляйте аутентификацию в InvitationsController и обновляйте этот фрагмент:

def create

  @invitation = Invitation.new(params[:invitation])
  @invitation.sender = current_user if logged_in?

  if @invitation.save

    Mailer.deliver_invitation(@invitation, signup_url(@invitation.token))
    flash[:notice] = "Thank you, invitation sent."

    if logged_in?
      redirect_to projects_url
    else
      redirect_to root_url
    end

  else
    render :action => 'new'
  end

end

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

1 голос
/ 12 декабря 2011

Я не могу понять, откуда взялся Mailer.deliver_invitation, вы используете драгоценный камень? это поможет, если вы создадите mailer.rb, есть ли у вас ошибка mgs / stack trace?

Посмотрите здесь, есть несколько руководств, 5 Конфигурация Action Mailer http://guides.rubyonrails.org/action_mailer_basics.html

Рассмотрите возможность использования устройства для аутентификации пользователя, https://github.com/plataformatec/devise Это сложно, но хорошо документировано и легко настраивается для быстрого запуска.

Я предполагаю, что вы используете Rails 3.1 (работает и в более ранних версиях, просто найдите правильное руководство по вашей версии Rails, чтобы быть уверенным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...