我正在尝试创建一个邮件收发器,每当用户注册时都会发送电子邮件。很简单,但是我是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
和我的invitation_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
我还需要编辑什么?我如何将此连接到已经存在的用户注册和登录,工作良好?
您应该已经有一个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
我不确定我是否涵盖了所有的基础,但我认为这至少应该为您指明了正确的方向。
我看不到mailer . deliver_invite来自哪里,您使用gem吗?如果你能创建邮件,会有帮助吗?Rb,你有任何错误的毫克/堆栈跟踪?
看这里有一些指南,5动作邮件配置http://guides.rubyonrails.org/action_mailer_basics.html
考虑使用设计进行用户身份验证,https://github.com/plataformatec/devise它是复杂的,但有良好的文档,并且易于配置,以快速启动。
我假设你使用的是Rails 3.1(也适用于早期版本,只需找到正确的指南到你的Rails版本,以确保)