У вас уже должен быть 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
Я не уверен, охватил ли я все базы, но я думаю, что это должно, по крайней мере, указать вам правильное направление.