Мне не известны какие-либо драгоценные камни, которые обрабатывают весь процесс (пользователь >> электронная почта >> регистрация).Если вы просто хотите создать взаимосвязь, когда пользователь приходит по определенной ссылке, создайте специальный маршрут приглашения (отдельный контроллер не нужен, но просто чтобы прояснить это):
# routes.rb
match '/invite/:friend_id' => 'public#invite', :as => :invite
# PublicController
def invite
session[:referring_friend] = params[:friend_id]
redirect_to root_path
end
# UsersController
def create
@user = User.new(params[:user])
if @user.save
@user.create_friendship(session[:referring_friend]) if session[:referring_friend]
...
else
...
end
end
Если вы хотите отслеживать показатели конверсии, я бы порекомендовал создать модель ссылок и использовать ее для отслеживания кликов и регистраций:
class Link < ActiveRecord::Base
belongs_to :user
attr_accessible :user, :user_id, :clicks, :conversions
def click!
self.class.increment_count(:clicks, self.id)
end
def convert!
self.class.increment_count(:conversions, self.id)
end
end
# routes.rb
match '/invite/:link_id' => 'links#hit', :as => :invite
# LinksController
def hit
link = Link.find(params[:link_id])
link.click!
session[:referring_link_id] = link.id
redirect_to root_path # or whatever path (maybe provided by link...)
end
# UsersController
def create
@user = User.new(params[:user])
if @user.save
if session[:referring_link_id]
link = Link.find(session[:referring_link_id])
link.convert!
@user.create_friendship(link.user_id)
end
...
else
...
end
end
Какой метод вы выберете, зависит от того, что вы хотитепроследить по дороге.