#124 Beta Invitations

本文介绍如何构建一个用户邀请系统,该系统允许现有用户邀请新用户加入,并通过电子邮件发送邀请链接。文章详细介绍了数据库模型的设计,包括邀请者、被邀请者的关联以及验证流程。
You know those invitation systems where a given user can invite a number of other people to join? That's what I show you how to make in this episode.

script/generate nifty_scaffold invitation sender_id:integer recipient_email:string token:string sent_at:datetime new
script/generate migration add_invitation_to_users invitation_id:integer invitation_limit:integer
script/generate mailer Mailer invitation

# models/invitation.rb
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

# models/user.rb
validates_presence_of :invitation_id, :message => 'is required'
validates_uniqueness_of :invitation_id

has_many :sent_invitations, :class_name => 'Invitation', :foreign_key => 'sender_id'
belongs_to :invitation

before_create :set_invitation_limit

attr_accessible :login, :email, :name, :password, :password_confirmation, :invitation_token

def invitation_token
invitation.token if invitation
end

def invitation_token=(token)
self.invitation = Invitation.find_by_token(token)
end

private

def set_invitation_limit
self.invitation_limit = 5
end

# invitation_controller.rb
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

# users_controller.b
def new
@user = User.new(:invitation_token => params[:invitation_token])
@user.email = @user.invitation.recipient_email if @user.invitation
end

# routes.rb
map.signup '/signup/:invitation_token', :controller => 'users', :action => 'new'

# models/mailer.rb
def invitation(invitation, signup_url)
subject 'Invitation'
recipients invitation.recipient_email
from 'foo@example.com'
body :invitation => invitation, :signup_url => signup_url
invitation.update_attribute(:sent_at, Time.now)
end

<!-- mailer/invitation.erb -->
You are invited to join our beta!

<%= @signup_url %>

<!-- invitations/new.html.erb -->
<% form_for @invitation do |f| %>
<p>
<%= f.label :recipient_email, "Friend's email address" %><br />
<%= f.text_field :recipient_email %>
</p>
<p><%= f.submit "Invite!" %></p>
<% end %>

<!-- home/index.html.erb -->
<p>We are currently in private beta. Please submit your email address below, and we will notify you when we are ready to accept more users.</p>

<% form_for Invitation.new do |f| %>
<p>
<%= f.label :recipient_email, "Your Email:" %>
<%= f.text_field :recipient_email %>
<%= f.submit 'Submit' %>
</p>
<% end %>

<!-- users/new.html.erb -->
<%= f.hidden_field :invitation_token %>
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值