4

我正在尝试创建一个在用户注册时发送电子邮件的邮件程序。很简单,但我是 Rails 新手。

我有一个已经创建用户的网站。我有一个可以正常工作的登录和注册页面,但需要一些帮助来创建一个发送电子邮件确认链接的邮件程序,并且可能需要一个选项来发送这些电子邮件而无需用户注册,例如为用户邀请创建一个单独的页面。

我已经生成了一个模型邀请.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

我还需要编辑什么?如何将其连接到运行良好的现有用户注册和登录?

4

2 回答 2

2

您应该已经有一个用于注册目的的 UsersController 或类似的东西,您当前通过名为 route 的 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

我不确定我是否涵盖了所有基础,但我认为这至少应该为您指明正确的方向。

于 2011-12-12T17:32:33.640 回答
1

我看不到 Mailer.deliver_invitation 来自哪里,你使用 gem 吗?如果您创建 mailer.rb 会有帮助吗,您有任何错误 mgs/堆栈跟踪吗?

看看这里有一些指南,5 Action Mailer Configuration http://guides.rubyonrails.org/action_mailer_basics.html

考虑使用 devise 进行用户身份验证,https://github.com/plataformatec/devise 它很复杂,但有据可查且易于配置以快速启动。

我假设您使用的是 Rails 3.1(在早期版本中也可以使用,只需找到正确的 Rails 版本指南即可)

于 2011-12-12T17:26:03.793 回答